シェルスクリプトがシグナル9で殺されたかどうかを知る方法はありますか


14

殺され続けるbashスクリプト(javaプログラムから呼び出される)があります。私はいつもsignal 15withをキャッチしますtrapが、それから私が疑う他のシグナルが来signal 9ますが、それが本当にあるかどうかについては基本的に盲目signal 9です。

私はあなたができないことを知っているtrap signal 9のでsignal 9、私のシェルスクリプトを殺すかどうかを知ることができる他の方法はありますか?


4
シェルスクリプトは何を実行していますか?そのプロセスは、何かstatusを介して子プロセスにアクセスできる必要がありますwait(2)
スリグ

upstartで起動されたデーモンとして実行されているJavaプログラムは、シェルスクリプトプロセスを実行しています
jgr208

1
プログラムを-a entry,always -F arch=b64 -S kill -k kill_signals
たどっ

回答:


20

強制終了されたコマンドの終了ステータスは、シグナル番号に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でラップします。


1
これは、トラップできないシグナル9に対してのみ信頼できることに注意してください。他のシグナルはプログラムによってトラップされる可能性があり、その後、任意の値で終了できます。
GNP

はい、gnpが言ったように、キル-9は
トラップ

ソースはありますか?
トゥイフティ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.