web-dev-qa-db-ja.com

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

私は殺され続けているbashスクリプト(Javaプログラムから呼び出されます)を持っています。常にsignal 15trapでキャッチしますが、他の信号がそれに伴います私はsignal 9だと思いますが、それが本当にsignal 9であるかどうかについては基本的に盲目です。

trapsignal 9を実行できないことはわかっています。signal 9がシェルスクリプトを強制終了していることを確認する方法は他にありますか?

15
jgr208

Killされたコマンドの終了ステータスは、シグナル番号に128を加えたものにする必要があります。したがって、終了ステータスを使用して、プロセスがkillしたシグナルを見つけることができます。

シェルの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でラップします。

21
Lucas