Gibt es eine Möglichkeit festzustellen, ob ein Shell-Skript mit Signal 9 beendet wurde?

14

Ich habe ein Bash-Skript (das von einem Java-Programm aufgerufen wird), das immer wieder getötet wird. Ich fange das immer signal 15mit, trapaber dann kommt ein anderes Signal, von dem ich vermute, dass es signal 9im Grunde genommen blind ist, ob es wirklich so ist signal 9.

Ich weiß, dass Sie das nicht trap signal 9können. Kann ich also auf andere Weise feststellen, ob signal 9mein Shell-Skript beendet wird?

jgr208
quelle
4
Was läuft das Shell-Skript? Dieser Prozess sollte Zugriff auf den statusProzess des Kindes über wait(2)oder etwas haben.
Am
Ein Java-Programm, das als mit
upstart
1
Sie können das Programm und sucht eine Linie strace , die „getötet von SIGKILL“ oder tun etwas auditd Arbeit mit sagt-a entry,always -F arch=b64 -S kill -k kill_signals
Bratchley

Antworten:

20

Der Beendigungsstatus eines getöteten Befehls sollte die Signalnummer plus 128 sein. Sie können also den Beendigungsstatus verwenden, um herauszufinden, welches Signal von Ihnen verarbeitet wurde.

Ich habe es so unter Linux in der Shell getestet:

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

BEARBEITEN: Beachten Sie, dass ein Programm entscheiden kann, mit einem beliebigen Wert¹ zu beenden (Sie müssen also entscheiden, inwieweit Sie dem Beendigungsstatus als Effekt eines Signals vertrauen):

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

Fußnote 1: Auf meinen Systemen werden Exit-Codes als vorzeichenlose 8-Bit-Zahlen dargestellt, sodass sie mit 256 = 0 umbrochen werden.

Lucas
quelle
1
Beachten Sie, dass dies nur für Signal 9 zuverlässig ist, das nicht abgefangen werden kann. Das Programm kann andere Signale abfangen, die dann mit einem beliebigen Wert beendet werden können.
GnP
ja, wie gnp sagte, kann der kill -9 nicht abgefangen werden
c4f4t0r
Hast du irgendwelche Quellen?
30.