15

Script-A.sh から Script-B.sh へのシグナル送信をトラップしたいので、Script-A.sh で次のコマンドを使用します。

(SIGINT を Script-B.sh に送信)
kill -2 $PID_Script-B.sh

そして Script-B.sh では、シグナルをキャッチして関数 Clean を呼び出します

トラップ「クリーン」2

これは機能しません。代わりに、Script-B.sh は Clean !! を実行せずにすぐに強制終了されます。

また、ターミナルからそれをトラップするスクリプトに SIGINT を送信したい場合、 actrl-cは正しくキャッチされますが、コマンドを介してシグナルを指定した場合はそうではありません。kill -2 $pid_of_script

SIGINT ( ctrl-cVS kill -2 $pid_of_script) を送信する 2 つの方法の違いと、スクリプトから別のスクリプトに SIGINT を送信する方法について何か考えはありますか?

4

2 に答える 2

14

あなたが報告した行動を再現することができました。私の仮説は、スクリプトは非対話型シェルからSIGINT(スクリプトの子として)実行されているため、キーボード信号であるそれは無視されるというものです。

差出人info bash

バックグラウンドプロセスは、プロセスグループIDが端末のものとは異なるプロセスです。このようなプロセスは、キーボードで生成された信号の影響を受けません。

trapあなたとそれkillのような別の信号を使用する場合、私はそれがSIGUSR1機能することを発見しました。

からの追加情報man bash

bashによって実行される非組み込みコマンドでは、シグナルハンドラーが、シェルによってその親から継承された値に設定されます。ジョブ制御が有効になっていない場合、非同期コマンドは、これらの継承されたハンドラーに加えて、SIGINTおよびSIGQUITを無視します。

bashがコマンドの完了を待機していて、トラップが設定されているシグナルを受信した場合、コマンドが完了するまでトラップは実行されません。

SIGCHLDのトラップは、終了する子ごとに実行されます。

于 2010-03-26T22:47:44.863 に答える