繁体   English   中英

我的被​​叫脚本中有“捕获'echo ignore'USR1”的字样,为什么调用脚本被杀死?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM