
Tengo un script bash (llamado desde un programa java) que sigue muriendo. Siempre capto el signal 15
with trap
pero luego aparece alguna otra señal que sospecho que es, signal 9
pero estoy básicamente ciego en cuanto a si realmente lo es signal 9
.
Sé que no puedes trap
signal 9
, entonces, ¿hay alguna otra manera de saber si signal 9
está matando mi script de shell?
Respuesta1
El estado de salida de un comando cancelado debe ser el número de señal más 128. Por lo tanto, puede usar el estado de salida para averiguar qué señal canceló su proceso.
Lo probé así en Linux en el 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
EDITAR: Tenga en cuenta que un programa puede decidir salir con cualquier¹ valor (por lo que debe decidir hasta qué punto confía en que el estado de salida sea el efecto de una señal):
for i in $(seq 256); do
sh -c "exit $i"
echo Program exited with $?
done
Nota al pie 1: En mis sistemas, los códigos de salida se representan como números de 8 bits sin signo, por lo que se ajustan a 256=0.