¿Hay alguna manera de saber si un script de shell se mató con la señal 9

14

Tengo un script bash (llamado desde un programa java) que sigue siendo asesinado. Siempre capto el signal 15con trappero luego aparece otra señal que sospecho que es, signal 9pero estoy básicamente ciego en cuanto a si realmente es así signal 9.

Sé que no puedes trap signal 9, así que ¿hay alguna otra manera de saber si signal 9está matando mi script de shell?

jgr208
fuente
44
¿Qué está ejecutando el script de shell? Ese proceso debe tener acceso al statusproceso del niño a través de wait(2)o algo.
2016
un programa de Java que se ejecuta como un demonio que comenzó con el arranque está ejecutando el proceso de script de shell
jgr208
1
Podrías enderezar el programa y buscar una línea que diga "asesinado por SIGKILL" o hacer un trabajo de auditoría con-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Respuestas:

20

El estado de salida de un comando eliminado 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 eliminó 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 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.

Lucas
fuente
1
Tenga en cuenta que esto solo es confiable para la señal 9 que no puede ser atrapada. El programa puede atrapar otras señales que luego pueden salir con cualquier valor.
GnP
sí, como dijo gnp, la matanza -9 no puede ser atrapada
c4f4t0r
¿Tienes alguna fuente?
Twifty