
強制終了され続ける bash スクリプト (Java プログラムから呼び出される) があります。 を常にキャッチしますsignal 15
がtrap
、その後、 であると思われる他のシグナルがやってきますが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 で折り返されます。