2012-02-13 10 views
27

信号を受信すると、trapを使用していくつかのコマンドを実行できます。例:Bashで受信信号名を確認する

trap 'echo hello world' 1 2 

指定されたいずれかの信号が受信されると、「hello world」が表示されます。

しかし、受信したシグナル名はどのようにプリント/識別できますか?

答えて

35

(あなたが唯一の信号の数を持っているし、名前をしたい場合は、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 
+0

感謝。しかし、それは私のために働いていない。その関数trap_with_arg()はシグナルが受信されるまでブロックします。私は、信号が受信されたときに、スクリプトが実行されている間に、信号名が表示されるようにしたい。私の場合、私はその信号を待っていません。それが到着するたびに、印刷する必要があります。 –

+8

'trap_with_arg()'はブロックされません。入力をループしてトラップハンドラを設定し、その後に戻ります。 – perelman

+0

Lunar Mushroomsでは、スクリプト内のコマンドが実行されている間にトラップが処理されないため、ブロックされているように見えることがあります。 'sleep 'の途中でスクリプトに信号を送りた場合、' sleep'が完了するまであなたのトラップは実行されません。非同期ではありません。トラップはスクリプト内のコマンド間の信号を捕捉します。 – Ray

6

内を取得した場合トラップ(信号でトリガーされたとき)、$?変数は、最初にシグナル番号を加えた128に設定されているので、あなたは、あなたが、その後使用して、信号の名前を取得することができます

sig=$(($? - 128)) 

のようなものにトラップアクションの最初の文を作ることによって、変数へのシグナル番号を割り当てることができますkillコマンド

kill -l $sig 
+1

これはいいですが、Linux 3.10でBash 4.3.30を使ってもうまくいきません。 '$ 'はシグナルハンドラの始めに' TERM'シグナルで呼び出されていても0です。 –

+0

これはより簡単なので、これは最善の答えのようです。 – codeforester

1

これを行うための簡単な方法:

_handler() { 
    signal=$1 
    echo signal was $signal 
} 

trap '_handler SIGTERM' SIGTERM 
trap '_handler SIGINT' SIGINT 
関連する問題