2011-04-28 7 views
1

/tmp/trap.shヘルプはバッシュ

#! /bin/bash 
echo parent 
trap signalCaught HUP INT QUIT TERM 

signalCaught() { 
    echo "SIGNAL DETECTED I am the parent." 
} 

SLEEP=10 
for i in $(seq $SLEEP -1 0); do 
    echo "$i" 
    sleep 1 
done 

/tmp/trap2.sh 2>&1 | tee -ai /tmp/garbage.txt 

echo " --- terminating \"$0\" " 

/tmp/trap2.shをSIGQUITを必要

#! /bin/bash 
echo child 
trap 'echo signal caught in child' HUP INT QUIT TERM 
read JUNK 

SLEEP=10 
echo sleeping for $SLEEP seconds 
sleep $SLEEP 

echo " --- terminating \"$0\" " 

私は/tmp/trap.shを実行し、それがtrap2を呼び出すことができます.sh、SIGQUITは親プロセス(trap.sh)によってのみ捕捉されます。 「子供に捉えられたエコー信号」はエコーされません。 I であると仮定すると、その子はSIGQUITを捕まえません。

子供がQUITをキャッチしない理由はありますか?それはキャッチします

答えて

3

tee -ai /tmp/garbage.txtSIGQUITをキャッチしています。

% pstree 62655 
-+= 62655 nicholas -zsh 
\-+= 62867 nicholas /bin/bash ./trap.sh 
    |--- 62889 nicholas /bin/bash /tmp/trap2.sh 
    \--- 62890 nicholas tee -ai /tmp/garbage.txt 

私は^\を押すと、それは木の底に配信されます(PID 62890):

% sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }' 
dtrace: description 'proc:::signal-send ' matched 1 probe 
CPU  ID     FUNCTION:NAME 
    1 19556   sigprocmask:signal-send Terminal -3 62890 

両方trap.shtrap2.shが実行されているときに、たとえば、次のようなものを持っています明示的にkill -QUIT 62889とすると、実際にはsignal caught in childが印刷されます。

(私の仮定に挑戦作るためのコメンターに感謝:。ここに私の以前の答えは完全に間違っていた)@ Random832言及しているよう

は、プロセスグループはシグナルを送達するために使用されています。 pstree出力では、=はプロセスグループのリーダーを示します。また、同じグループ内にあるps -j出力、trap.shtrap2.shで見るとtee -ai ...ことができます。

% pstree 64261 
-+= 64261 nicholas -zsh 
\-+= 64551 nicholas /bin/bash ./trap.sh 
    |--- 64554 nicholas /bin/bash /tmp/trap2.sh 
    \--- 64555 nicholas tee -ai /tmp/garbage.txt 
% ps -jxp 64261,64551,64554,64555 
USER  PID PPID PGID SESS JOBC STAT TT  TIME COMMAND 
nicholas 64261 64260 64261 90c3998 1 S s002 0:00.12 -zsh 
nicholas 64551 64261 64551 90c3998 1 S+ s002 0:00.01 /bin/bash ./trap.sh 
nicholas 64554 64551 64551 90c3998 1 S+ s002 0:00.00 /bin/bash /tmp/trap2.sh 
nicholas 64555 64551 64551 90c3998 1 S+ s002 0:00.00 tee -ai /tmp/garbage.txt 
それはあなたの場合、実際に死ん1、すなわち「ルート」のプロセスにではなく、フォアグラウンドのプロセスに配信される方法
+2

_haven't_シグナルハンドラを設定していませんか?なぜ彼はSIGINTのさまざまな動作を見ていますか?ドキュメントを提供してください。 – Random832

+1

私の控えめな思考に挑戦してくれてありがとう。 –

+0

私はいくつかの研究を行っており、プロセスグループやシグナルがグループ内のすべてのプロセスに配信されているように見えます... pstreeは各プロセスのプロセスグループIDを表示できますか? – Random832