无法在后台shell中捕获SIGINT信号



在子进程/后台进程中运行时无法捕获信号。

下面是我的bash脚本:
#!/bin/bash
echo "in child"
trap "got_signal" SIGINT
function got_signal {
  echo "trapped"
  exit 0
}
while [ true ]; do
    sleep 2
done

当运行这个和以后执行

kill -SIGINT (pid)

一切正常,打印trapped并退出。

现在,如果我从父脚本开始相同的脚本,像这样:
#!/bin/bash
echo "starting the child"
./child.sh &

子进程不再捕获信号....

?

改变使用SIGTERM而不是SIGINT后,它似乎工作正常…div ?

OSX上的bash管理页(但在其他版本中应该是相同的)对信号处理有这样的说明:

bash运行的非内置命令将信号处理程序设置为该值由shell从父进程继承。当作业控制不在时因此,异步命令除了忽略SIGINTSIGQUIT之外,还会忽略这些继承的处理程序

trap命令下的

进入shell时被忽略的信号不能被困或重置

由于脚本默认情况下不使用作业控制,这意味着您正在讨论的情况

按你的注释:

Signals ignored upon entry to the shell cannot be trapped or reset.

我注意到ZSH不会忽略父进程和子进程之间来回发送的信号,但是bash会。这是我自己发的问题:

捕获CHLD信号- ZSH工作,但ksh/bash/sh don't?

相关内容

  • 没有找到相关文章

最新更新