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

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

Ich habe ein Bash-Skript (das von einem Java-Programm aufgerufen wird), das immer wieder beendet wird. Ich fange es immer ab, signal 15aber trapdann kommt ein anderes Signal, von dem ich vermute, dass es das ist, signal 9aber ich bin im Grunde blind, ob es das wirklich ist signal 9.

Ich weiß, dass Sie das nicht können trap signal 9. Gibt es also eine andere Möglichkeit, herauszufinden, ob signal 9mein Shell-Skript beendet wird?

Antwort1

Der Beendigungsstatus eines beendeten Befehls sollte der Signalnummer plus 128 entsprechen. So können Sie anhand des Beendigungsstatus herausfinden, welches Signal Ihren Prozess beendet hat.

Ich habe es unter Linux in der Shell folgendermaßen 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 jedem beliebigen¹ Wert zu beenden (Sie müssen also entscheiden, inwieweit Sie darauf vertrauen, dass der Beendigungsstatus die Auswirkung eines Signals ist):

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

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

verwandte Informationen