陷阱信号在儿童背景过程中

时间:2011-04-13 00:26:33

标签: bash signals child-process sigint bash-trap

在儿童/后台进程中运行时,我无法捕获信号。

这是我的简单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)

一切都按预期工作,它打印'被困'并退出。

现在,如果我从这样的父脚本启动相同的脚本:

#!/bin/bash

echo "starting the child"

./child.sh &

然后孩子不再陷入信号......?

更改为使用SIGTERM而不是SIGINT后,它似乎正常工作......?

2 个答案:

答案 0 :(得分:11)

OSX上的bash联机帮助页(但在其他版本中应该是相同的)有关于信号处理的说法:

  

bash运行的非内置命令将信号处理程序设置为值   shell从其父级继承。当工作控制不在时   效果,异步命令除了忽略SIGINTSIGQUIT   这些继承的处理程序。

以及trap命令下的

  

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

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

答案 1 :(得分:3)

根据你的说明:

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

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

Trapping CHLD signal - ZSH works but ksh/bash/sh don't?