2011-04-28 3 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). «Сигнал эха, пойманный в дочернем» не отражается. I предположим, что, что ребенок не поймает SIGQUIT.

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

ответ

3

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 

Когда я нажимаю ^\, он доставляется в нижней части дерева (ИДП 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 
+2

Как это доставляется в процесс «корень», а не на переднем плане процесса, то есть тот, который на самом деле умирает, если вас _haven't_ установить обработчик сигнала? И почему он видит другое поведение для SIGINT? Просьба предоставить документацию. – Random832

+1

Спасибо, что оспаривали мое неряшливое мышление. –

+0

Я провел некоторое исследование, и похоже, что что-то связано с группами процессов и сигналами, передаваемыми каждому процессу в группе ... Может ли pstree показывать идентификатор группы процессов для каждого процесса? – Random832

Смежные вопросы