Os sinais de interceptação do processo do Linux podem ser enviados para o seu filho?

2

Eu tenho um shell wrapper em torno de um grande executável. Faz algo assim:

run/the/real/executable "$@" &
PID=$!
# perform
# a few
# minor things
wait $PID
# perform some
# post-processing

Uma das coisas que ele faz após o wait é verificar se há core-dumps e processar as falhas, no entanto, até então o processo já está inativo e algumas informações não estão mais disponíveis.

O sinal fatal ( SIGSEGV ou SIGBUS ) pode ser interceptado pelo shell script antes de ser entregue à própria criança?

Eu poderia, por exemplo, executar lsof -p $PID para obter a lista de arquivos abertos pelo processo antes de morrer ...

Atualizar : Eu tentei usar strace para capturar o processo recebendo um sinal. Infelizmente, parece haver uma corrida - quando strace relata o sinal da criança, a criança está saindo e não há como saber se a lsof obterá a lista de seus arquivos ou não ... / p>

Aqui está o script de teste, que gera /bin/sleep e tenta obter os arquivos abertos para gravação. Algumas vezes o /tmp/sleep-output.txt é informado como deveria, outras vezes a lista está vazia ...

ulimit -c 0
/bin/sleep 15 > /tmp/sleep-output.txt &

NPID=$!

echo "Me: $$, sleep: $NPID"

(sleep 3; kill -BUS $NPID) &

ps -ww $NPID
while read line
do
        set -x
        outputfiles=$(lsof -F an -b -w -p $NPID | sed -n '/^aw$/ {n; s,.,,; p}')
        ps -ww $NPID
        lsof -F an -b -w -p $NPID
        break
done < <(strace -qq -p $NPID -e trace=signal 2>&1)
echo $outputfiles

wait $NPID

O teste acima requer o uso de ksh ou bash (para a construção < <(...) funcionar).

    
por Mikhail T. 25.06.2018 / 20:32

1 resposta

2

Tanto quanto eu sei, não há métodos shell para fazer o que você está tentando, isso terá que ser feito a partir de um programa personalizado.

Use ptrace() para monitorar o processo, da mesma forma que um depurador faz. Quando o processo receber um sinal, ele será interrompido e o programa de monitoramento será notificado (sua chamada para wait() retornará e WIFSTOPPED(status) será verdadeira).

Em seguida, ele pode executar lsof -p <pid> para listar os arquivos abertos do processo e, em seguida, chamar ptrace(PTRACE_CONT, pid, NULL, 0) para reiniciar o processo.

    
por 27.06.2018 / 21:37