Bash中需要SIGQUIT的帮助

Bash中需要SIGQUIT的帮助,bash,gnu,signals,Bash,Gnu,Signals,/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 /t

/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

#! /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)捕获。“孩子身上的回声信号”没有回声。那么,我假设孩子没有抓到他


有没有什么原因让孩子不抓到你?它确实捕获INT

tee-ai/tmp/garbage.txt
正在捕获
SIGQUIT
。例如,当
trap.sh
trap2.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):

如果我显式地
kill-QUIT 62889
,那么它确实会打印捕获在child中的
信号

(感谢评论者让我质疑我的假设:我之前的回答完全错误。)

正如@Random832所提到的,过程组用于传递信号。在pstree输出中,
=
表示进程组的领导者。您还可以通过
ps-j
输出看到,
trap.sh
trap2.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

它是如何传递到“根”进程而不是前台进程的,即如果您没有设置信号处理程序,它实际上会死亡的进程?为什么他看到SIGINT有不同的行为?请提供文档。感谢您挑战我的草率思维。我做了一些研究,看起来这与流程组有关,并且向组中的每个流程发送信号。。。pstree可以显示每个进程的进程组id吗?终端应用程序会发送它(在我的情况下,终端也会检查,xterm也会做同样的事情)。您可以在DTrace输出中看到,但是tee手册页显示-i,--ignoreinterrupts:ignoreinterruptsignals。那么“T”应该忽略我的信号,对吗?
% 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