Posso rastrear de onde um SIGINT veio se não fosse de um usuário?

4

Eu tenho um script de execução longa (3 horas) em execução em uma máquina do CentOS 7. O script executa um loop com um loop interno e chama curl em cada iteração.

Estou começando o script com PM2 porque ele já está no sistema e é bom para gerenciamento de processos. No entanto, parece que pode não ser bom para scripts de shell. Quando cheguei esta manhã, vi que o PM2 havia reiniciado meu shell script 6 vezes. Os logs do PM2 dizem que ele recebeu um SIGINT e foi reiniciado. Como esse script resulta em dados sendo enviados para um banco de dados, isso significa que meus dados foram enviados 6 vezes. Isso não é bom.

Sou a única pessoa que faz login na caixa para não ser outro usuário.

Então, a próxima pergunta é se isso é um bug no PM2 ou em um SIGINT legítimo. O que levanta a questão: se é legítimo, de onde vem? Eu tenho que determinar (se possível) se o sistema operacional de alguma forma está matando esse processo antes de enviar isso como um bug no PM2 (que parece ser a coisa mais provável).

    
por jcollum 17.11.2016 / 17:21

1 resposta

6

sysdig pode monitorá-los usando o filtro evt.type=kill :

# terminal uno
perl -E 'warn "$$\n"; $SIG{INT}= sub { die "aaaaargh" }; sleep 999'

# terminal dos
sysdig -p '%proc.pname[%proc.ppid]: %proc.name -> %evt.type(%evt.args)' evt.type=kill

# terminal tres
kill -INT 11943  # or whatever

Pode ser necessário um filtro mais específico para evitar, e. systemd de spam a partir da sysdig output ou grep dos seus nomes de processos ou pids:

# sysdig -p '%proc.pname[%proc.ppid]: %proc.name -> %evt.type(%evt.args)' evt.type=kill
systemd[1]: systemd-udevd -> kill(pid=11969(systemd-udevd) sig=15(SIGTERM) )
systemd[1]: systemd-udevd -> kill(res=0 )
systemd[1]: systemd-udevd -> kill(pid=11970(systemd-udevd) sig=15(SIGTERM) )
systemd[1]: systemd-udevd -> kill(res=0 )
systemd[1]: systemd-udevd -> kill(pid=11971(systemd-udevd) sig=15(SIGTERM) )
systemd[1]: systemd-udevd -> kill(res=0 )
sshd[11945]: bash -> kill(pid=11943(perl) sig=2(SIGINT) )
sshd[11945]: bash -> kill(res=0 )
    
por 17.11.2016 / 18:09