2011-04-28 110 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