2011-04-28 150 views
1

/tmp/trap.sh幫助需要SIGQUIT Bash中

#! /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

#! /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)。 「回聲信號在小孩」沒有迴應。我假設,那麼,那個孩子沒有抓住SIGQUIT。

是不是有一個孩子不接受QUIT的理由?它確實捕獲INT

回答

3

tee -ai /tmp/garbage.txt正在追趕SIGQUIT。因此,例如,當兩個trap.shtrap2.sh正在運行,你有這樣的:

% 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 

如果我明確kill -QUIT 62889,那麼它確實打印signal caught in child

(多虧了評論者讓我挑戰我的假設:我以前在這裏的回答是完全錯誤的)

正如@ Random832提到,工藝組用於傳遞信號。在pstree輸出中,=指示進程組的組長。你也可以用ps -j輸出,trap.shtrap2.shtee -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 
+2

它是如何傳遞到「根」的過程,而不是到前臺進程,即實際死亡,如果你的人_haven't_設置信號處理程序?爲什麼他看到SIGINT有不同的行爲?請提供文件。 – Random832 2011-04-28 00:55:54

+1

感謝您挑戰我的草率思維。 – 2011-04-28 01:11:16

+0

我已經完成了一些研究,看起來有些事情需要處理組和信號傳遞給組中的每個進程......可以顯示每個進程的進程組ID嗎? – Random832 2011-04-28 01:16:01