Требуется помощь SIGQUIT в Bash - PullRequest
1 голос
/ 28 апреля 2011

/ 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). «Эхо-сигнал пойман у ребенка» не отражается. Тогда я предполагаю , что ребенок не подхватывает SIGQUIT.

Есть ли причина, по которой ребенок не улавливает QUIT? Это действительно ловит INT

1 Ответ

3 голосов
/ 28 апреля 2011

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):

% 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.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
...