我有“陷阱'回声忽略'USR1"在我的被调用脚本中,为什么调用脚本被杀死? [英] I have "trap 'echo ignore' USR1" in my called script, why does the calling script get killed?
问题描述
说我有以下两个bash脚本:
Say I have these two bash scripts:
/tmp/trapper:
/tmp/trapper:
#!/bin/bash
trap 'echo trapper: ignoring USR1' USR1
"$(dirname $0)"/usr1er & p=$!
sleep 1
echo trapper: now killing usr1er
kill $p
echo trapper: sleeping
sleep 1
echo trapper: reached end of trapper
/tmp/usr1er:
/tmp/usr1er:
#!/bin/bash
trap 'echo "usr1er: EXIT received, sending USR1"; kill -USR1 0' EXIT
while sleep 1;do echo usr1er: sleeping;done
陷阱程序应该捕获USR1并直接忽略它.它启动usr1er,并使用USR1信号终止其进程组.现在,如果我从交互式shell本身以脚本形式启动trapper,它将杀死usr1er并正常退出:
trapper is supposed to trap USR1 and simply ignore it. It starts usr1er, which kills its process group with the USR1 signal. Now, if I start trapper as a script on its own from an interactive shell, it kills usr1er and exits normally:
$ /tmp/trapper; echo done
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
/tmp/trapper: line 9: 16596 Terminated "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper
done
当我尝试 $(/tmp/trapper)
时,它将退出整个外壳.同样,如果我制作一个单独的脚本来调用/tmp/trapper
,例如/tmp/outer
:
While if I try $(/tmp/trapper)
, it exits the whole shell. Similarly, if I make a separate script that calls /tmp/trapper
, like /tmp/outer
:
#!/bin/bash
"$(dirname $0)"/trapper
echo outer: reached end of outer
在不打印外伸手"的情况下被杀死:
it gets killed without printing the "reached end of outer":
$ /tmp/outer
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
/tmp/trapper: line 9: 23544 Terminated "$(dirname $0)"/usr1er
User defined signal 1
trapper: ignoring USR1
trapper: reached end of trapper
为什么?
推荐答案
似乎 $()
不会不用一个单独的进程组/PGID启动该进程(显然是为了使 Cc
工作).
It seems that $()
does not start the process with a separate process group / PGID (apparantly for making C-c
work).
此外,任何非交互式外壳程序也不会为其子代启动单独的PGID(除非您使用set -m打开作业控制):
Also, any non-interactive shell will also not start separate PGID's for their children (unless you turn on job control with set -m):
$ bash -c '/tmp/trapper;echo done'
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
$ /tmp/trapper: line 9: 17522 Terminated "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper
请注意,不会打印"done",不会捕获USR1的外部bash脚本会被杀死,而trapper会一直活到最后.
Note that "done" is not printed, the outer bash script, which doesn't trap USR1, is killed while trapper keeps on living until the end.
您可以通过将 ps -o%p%r%c -p $$
放入其中来检查每个进程的PGID脚本:
You can check the PGID of each process by putting ps -o %p%r%c -p$$
in
the scripts:
$ /tmp/outer
PID PGID COMMAND
27630 27630 outer
PID PGID COMMAND
27633 27630 trapper
PID PGID COMMAND
27635 27630 usr1er
trapper: now killing usr1er
trapper: sleeping
usr1er: EXIT received, sending USR1
User defined signal 1
$ /tmp/trapper: line 9: 27635 Terminated "$(dirname $0)"/usr1er
trapper: ignoring USR1
trapper: reached end of trapper
这篇关于我有“陷阱'回声忽略'USR1"在我的被调用脚本中,为什么调用脚本被杀死?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!