Qual é a maneira mais fácil de detectar quais sinais estão sendo enviados para um processo?

3

Estou tentando depurar um problema com meu shell (especificamente, fish ) enviando sinais para meus processos em segundo plano. Eu gostaria de poder reconhecer quais sinais um processo está recebendo.

Idealmente, gostaria que algum programa fizesse algo assim:

$ log_signals > signals.txt &

O qual então escreveria os sinais que recebeu em sua saída. No entanto, não acredito que tal programa exista prontamente.

Qual é a maneira mais simples de capturar sinais recebidos e inspecioná-los, de preferência sem precisar escrever meu próprio programa?

(Estou executando o OS X, não o Linux, então prefiro uma resposta mais independente da plataforma, se possível.)

    
por Alexis King 22.02.2015 / 11:01

3 respostas

1

Você pode usar gdb para fazer isso:

gdb --batch -ex 'handle all print' -ex 'handle all nostop' -ex 'handle all pass' -ex 'run' cat irá rodar cat sob o GDB e imprimir todos os sinais, passá-los para o programa e não parar a execução.

Isso é mais difícil para um programa em segundo plano, já que o GDB tentará entrar em segundo plano. Talvez seja melhor começar com cat & e, em seguida, anexar o depurador em outra janela: gdb -ex 'handle all print' -ex 'handle all nostop' -ex 'handle all pass' -ex 'c' (pgrep cat)[1] . Empurre q[ENTER] três vezes para passar por todo o spaff, e então você pode assistir cat run.

    
por 22.02.2015 / 11:52
0

Desde Stéphane postou esta informação como um comment , mas achei essa informação mais útil do que qualquer resposta existente, estou repostando o comentário como uma resposta.

Apenas para Linux: strace imprime sinais por padrão, portanto, você pode usar o sinalizador -e para silenciar todas as chamadas do sistema para que os sinais sejam mais claros:

strace -e 'trace=!all' cmd

No meu caso, eu estava tentando descobrir qual processo estava matando um daemon que eu estava executando, então recebi uma saída assim:

[hendrenj@underling02 ~]$ strace -p 171869 -e 'trace=!all'
Process 171869 attached
--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=151513, si_uid=1000} ---
+++ killed by SIGTERM +++

Aqui você pode ver que eu anexei ao PID 171869, e esse processo foi enviado SIGTERM pelo processo com PID 151513.

Para referência futura, você pode conferir esta postagem no blog , que sugere ferramentas como auditd (que eu acredito que vem com o SELinux se você estiver em uma distro que o usa) ou stap (System Tap) se strace não for poderoso o suficiente.

    
por 21.06.2017 / 23:17
-1
strace -o logfile -e signal=all cmdline
    
por 02.06.2017 / 11:49