信号を受信すると、trap
を使用していくつかのコマンドを実行できます。例:Bashで受信信号名を確認する
trap 'echo hello world' 1 2
指定されたいずれかの信号が受信されると、「hello world」が表示されます。
しかし、受信したシグナル名はどのようにプリント/識別できますか?
信号を受信すると、trap
を使用していくつかのコマンドを実行できます。例:Bashで受信信号名を確認する
trap 'echo hello world' 1 2
指定されたいずれかの信号が受信されると、「hello world」が表示されます。
しかし、受信したシグナル名はどのようにプリント/識別できますか?
(あなたが唯一の信号の数を持っているし、名前をしたい場合は、kill -l $SIGNAL_NUM
は、信号の名前を出力します。あなたは、以下のように代わりにtrap
へのお電話での数字の信号名を使用していることを回避することができます)
This answerは、bashでトラップした信号を特定する唯一の方法は、トラップしたい信号ごとに別のラッパーを作成することです。 Another answer on that same questionはあなたのためにそれを行うにはラッパー関数を提供します。
コード:
#!/bin/bash
trap_with_arg() {
func="$1" ; shift
for sig ; do
trap "$func $sig" "$sig"
done
}
func_trap() {
echo Trapped: $1
}
trap_with_arg func_trap INT TERM EXIT
read # Wait so the script doesn't exit.
私は、その後、私はプロセスにシグナルを送ることができることを実行して、私は出力のよう
Trapped: INT
Trapped: TERM
Trapped: EXIT
内を取得した場合トラップ(信号でトリガーされたとき)、$?変数は、最初にシグナル番号を加えた128に設定されているので、あなたは、あなたが、その後使用して、信号の名前を取得することができます
sig=$(($? - 128))
のようなものにトラップアクションの最初の文を作ることによって、変数へのシグナル番号を割り当てることができますkillコマンド
kill -l $sig
これはいいですが、Linux 3.10でBash 4.3.30を使ってもうまくいきません。 '$ 'はシグナルハンドラの始めに' TERM'シグナルで呼び出されていても0です。 –
これはより簡単なので、これは最善の答えのようです。 – codeforester
これを行うための簡単な方法:
_handler() {
signal=$1
echo signal was $signal
}
trap '_handler SIGTERM' SIGTERM
trap '_handler SIGINT' SIGINT
感謝。しかし、それは私のために働いていない。その関数trap_with_arg()はシグナルが受信されるまでブロックします。私は、信号が受信されたときに、スクリプトが実行されている間に、信号名が表示されるようにしたい。私の場合、私はその信号を待っていません。それが到着するたびに、印刷する必要があります。 –
'trap_with_arg()'はブロックされません。入力をループしてトラップハンドラを設定し、その後に戻ります。 – perelman
Lunar Mushroomsでは、スクリプト内のコマンドが実行されている間にトラップが処理されないため、ブロックされているように見えることがあります。 'sleep 'の途中でスクリプトに信号を送りた場合、' sleep'が完了するまであなたのトラップは実行されません。非同期ではありません。トラップはスクリプト内のコマンド間の信号を捕捉します。 – Ray