Existe-t-il un moyen de savoir si un script shell a été tué avec le signal 9

14

J'ai un script bash (appelé depuis un programme java) qui ne cesse de se faire tuer. J'attrape toujours le signal 15avec trapmais alors un autre signal arrive que je soupçonne, signal 9mais je suis fondamentalement aveugle quant à savoir si c'est vraiment le cas signal 9.

Je sais que vous ne pouvez pas trap signal 9, alors y a-t-il un autre moyen de savoir si signal 9je tue mon script shell?

jgr208
la source
4
Qu'est-ce qui exécute le script shell? Ce processus doit avoir accès au statusprocessus enfant via wait(2)ou quelque chose.
thrig
un programme java qui s'exécute en tant que démon démarré avec upstart exécute le processus de script shell
jgr208
1
Vous pouvez étirer le programme et rechercher une ligne qui dit "tué par SIGKILL" ou faire un travail d'audit avec-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Réponses:

20

L'état de sortie d'une commande tuée doit être le numéro de signal plus 128. Vous pouvez donc utiliser l'état de sortie pour savoir quel signal tué vous traitez.

Je l'ai testé comme ça sur Linux dans le 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: Notez qu'un programme peut décider de quitter avec n'importe quelle valeur¹ (vous devez donc décider dans quelle mesure vous faites confiance à l'état de sortie pour être l'effet d'un signal):

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

Note de bas de page 1: Sur mes systèmes, les codes de sortie sont représentés sous forme de nombres 8 bits non signés, de sorte qu'ils se terminent à 256 = 0.

Lucas
la source
1
Notez que cela n'est fiable que pour le signal 9 qui ne peut pas être piégé. D'autres signaux peuvent être piégés par le programme qui peut ensuite sortir avec n'importe quelle valeur.
GnP
oui, comme l'a dit gnp, le kill -9 ne peut pas être piégé
c4f4t0r
Avez-vous des sources?
Twifty