
Eu tenho um script bash (chamado de um programa java) que continua sendo morto. Eu sempre pego o signal 15
with trap
, mas então aparece algum outro sinal que eu suspeito que seja, signal 9
mas estou basicamente cego para saber se é realmente signal 9
.
Eu sei que você não pode trap
signal 9
, então há alguma outra maneira de saber se signal 9
está matando meu script de shell?
Responder1
O status de saída de um comando eliminado deve ser o número do sinal mais 128. Portanto, você pode usar o status de saída para descobrir qual sinal eliminado você está processando.
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¹ (portanto, você deve decidir até que ponto 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: Em meus sistemas, os códigos de saída são representados como números não assinados de 8 bits, portanto, são agrupados em 256 = 0.