シェルスクリプトがシグナル9で強制終了されたかどうかを確認する方法はありますか?

シェルスクリプトがシグナル9で強制終了されたかどうかを確認する方法はありますか?

強制終了され続ける bash スクリプト (Java プログラムから呼び出される) があります。 を常にキャッチしますsignal 15trap、その後、 であると思われる他のシグナルがやってきますがsignal 9、それが本当に であるかどうかは基本的にわかりませんsignal 9

できないのはわかっていますが、がシェル スクリプトを強制終了しているtrap signal 9かどうかを確認する他の方法はありますか?signal 9

答え1

強制終了されたコマンドの終了ステータスは、シグナル番号に 128 を加えた値になります。したがって、終了ステータスを使用して、どのシグナルが強制終了されたかを調べることができます。

Linux のシェルで次のようにテストしました。

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

編集: プログラムは任意の値で終了することを決定できることに注意してください (したがって、終了ステータスがシグナルの効果としてどの程度信頼されるかを決定する必要があります):

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

脚注 1: 私のシステムでは、終了コードは符号なし 8 ビットの数値として表されるため、256=0 で折り返されます。

関連情報