16

子/バックグラウンドプロセスで実行しているときにシグナルをトラップできません。

これが私の簡単なbashスクリプトです:

#!/bin/bash

echo "in child"

trap "got_signal" SIGINT

function got_signal {
  echo "trapped"
  exit 0
}

while [ true ]; do
    sleep 2
done

これを実行し、後で実行する場合

kill -SIGINT (pid)

すべてが期待どおりに機能し、印刷trappedして終了します。

ここで、次のような親スクリプトから同じスクリプトを開始すると、次のようになります。

#!/bin/bash

echo "starting the child"

./child.sh &

その後、子供はもう信号をトラップしません....?

SIGINTの代わりにSIGTERMを使用するように変更した後、正しく機能しているようです...?

4

2 に答える 2

14

OSXのbashマンページ(ただし、他のバージョンでも同じである必要があります)には、信号処理について次のように記載されています。

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

さらに、trapコマンドの下で:

シェルへのエントリ時に無視された信号は、トラップまたはリセットできません。

スクリプトはデフォルトでジョブ制御を使用しないため、これはあなたが話しているケースを意味します。

于 2011-04-13T00:42:10.710 に答える
4

あなたのメモによると:

Signals ignored upon entry to the shell cannot be trapped or reset.

ZSHは親プロセスと子プロセスの間で送受信されるシグナルを無視しないことに気づきましたが、bashは無視します。これが私が自分で投稿した質問です:

CHLD信号のトラップ-ZSHは機能しますが、ksh / bash / shは機能しませんか?

于 2012-03-05T00:38:01.450 に答える