我有“陷阱'回声忽略'USR1"在我的被​​调用脚本中,为什么调用脚本被杀死? [英] I have "trap 'echo ignore' USR1" in my called script, why does the calling script get killed?

查看:66
本文介绍了我有“陷阱'回声忽略'USR1"在我的被​​调用脚本中,为什么调用脚本被杀死?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有以下两个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆