![](/img/trans.png)
[英]Sending kill -s USR1 from bash script stops the process while doing the same from terminal does not
[英]I have “trap 'echo ignore' USR1” in my called script, why does the calling script get killed?
说我有以下两个bash脚本:
的/ tmp /捕手:
#!/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:
#!/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并正常退出:
$ /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
:
#!/bin/bash
"$(dirname $0)"/trapper
echo outer: 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启动过程(apparantly制作Cc
工作)。
同样,任何非交互式外壳程序也不会为其子级启动单独的PGID(除非您使用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会一直活到最后。
您可以通过在脚本中添加ps -o %p%r%c -p$$
来检查每个进程的PGID:
$ /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
试试这个变化
的/ tmp / usr1er:
#!/bin/bash
trap 'echo "usr1er: EXIT received, sending USR1"; kill -USR1 $PPID' TERM
while sleep 1;do echo usr1er: sleeping;done
处理了TERM信号而不是EXIT,并将USR1发送到$PPID
而不是0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.