Existe alguma maneira de saber se um script de shell foi morto com o sinal 9


14

Eu tenho um script bash (chamado de um programa java) que continua sendo morto. Eu sempre pego o signal 15com, trapmas então surge outro sinal que eu suspeito que esteja, signal 9mas estou basicamente cego para saber se realmente é signal 9.

Eu sei que você não pode trap signal 9, então há outra maneira de saber se signal 9está matando meu script de shell?


4
O que está executando o script de shell? Esse processo deve ter acesso ao statusprocesso filho via wait(2)ou algo assim.
thrig

um programa java que está sendo executado como um daemon começou com arrivista está executando o processo shell script
jgr208

1
Você poderia strace o programa e procure uma linha que diz "morto por SIGKILL" ou fazer algum trabalho auditd com-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Respostas:


20

O status de saída de um comando morto deve ser o número do sinal mais 128. Portanto, você pode usar o status de saída para descobrir qual sinal morto você processa.

Eu testei assim no Linux no shell:

print_exit_status_for_signal () {
  (
    sleep 1000
    echo Exit staus $? = signal $(( $? - 128 ))
  ) &
  sleep 1
  killall "${1:+-$1}" sleep
}
print_exit_status_for_signal
print_exit_status_for_signal 15
print_exit_status_for_signal 9
print_exit_status_for_signal KILL
print_exit_status_for_signal TERM

EDIT: Observe que um programa pode decidir sair com qualquer valor¹ (então você precisa decidir até que ponto você confia no status de saída como efeito de um sinal):

for i in $(seq 256); do
  sh -c "exit $i"
  echo Program exited with $?
done

Nota de rodapé 1: Nos meus sistemas, os códigos de saída são representados como números de 8 bits não assinados, e são agrupados em 256 = 0.


1
Observe que isso é confiável apenas para o sinal 9, que não pode ser interceptado. Outros sinais podem ser capturados pelo programa, que pode sair com qualquer valor.
GnP 20/05

sim, como GNP disse, o kill -9 não pode ser traped
c4f4t0r

Você tem alguma fonte?
Twifty
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.