PID do processo causando erro

1

Eu tenho este script:

#!/bin/bash
# -> dump.$pid
ulimit -c unlimited
# trap ERR
set -o errexit
# also trap error in the middle of a pipe (1)
# otherwise it will only trap the error on (2)
set -o pipefail

trap 'echo "ERR $?"' ERR

echo "a"
echo "1" | ./crash | cat
echo "b"
echo "2" | ./crash
echo "c"

que funciona como pretendido:

$ ./script.sh >& script.log
$ echo "$?"
139
$ cat script.log
a
Segmentation fault (core dumped)
ERR 139

(sem pipefail imprimir "a b", sem errexit imprimir "a b c")

No entanto, como isso faz parte de um pipeline maior e é executado em um sistema em lotes, várias falhas podem ocorrer e as informações de argv no arquivo dump.????? não são suficientes.

Então: Como eu imprimo o PID (e, portanto, o nome do arquivo esperado do core dump) do processo que causou o erro do meu script, para que ele possa ser logado com todo o resto?

Os programas que falham podem fazer parte de pipelines maiores (especialmente eles podem nem sempre estar no final de um pipeline, portanto, o uso de pipefail ), e eu gostaria de evitar ter que cercar cada invocação com código wrapper ou não conseguir enviar dados diretamente entre os programas.

    
por pascal 02.09.2014 / 06:02

1 resposta

0

Acontece que a ativação do controle de tarefas é uma solução - mas apenas se não houver SIGSEGV trap, configuração que impede a saída detalhada.

set -o errexit
set -o pipefail
set -o monitor
trap 'echo "ERR $?"' ERR
echo "hi" | ./docrash | cat
echo "not reached"

Rodar isso dá exatamente a saída que eu estava procurando e muito mais. Imprime o PID para cada criança e mostra o erro:

$ ./err.sh >& err.log
$ cat err.log
./err.sh: line 21: 25110 Done                               echo "hi"
                   25111 Segmentation fault (core dumped) | ./docrash
                   25112                                  | cat
ERR  139
$ gdb docrash core.25111
...

As configurações podem ser combinadas, se você quiser ver falhas no pipe, mas não abortar o script que isso funciona:

set -o pipefail
set -o monitor
echo "hi" | ./docrash | cat
echo "pipe returned $?"

Imprime o traçado e continua:

$ ./err.sh
./err.sh: line 21: 25110 Done                               echo "hi"
                   25111 Segmentation fault (core dumped) | ./docrash
                   25112                                  | cat
pipe returned 139
    
por 03.09.2014 / 08:13