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

Mat*_*ieu 14 bash signals sigint child-process 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
Run Code Online (Sandbox Code Playgroud)

当运行这个以后再做

kill -SIGINT (pid)
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,打印"被困"并退出.

现在,如果我从父脚本启动相同的脚本,如下所示:

#!/bin/bash

echo "starting the child"

./child.sh &
Run Code Online (Sandbox Code Playgroud)

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

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

gee*_*aur 12

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

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

并进一步根据trap命令:

进入shell时忽略的信号不能被捕获或重置.

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


Rez*_*aee 5

根据您的注释:

Signals ignored upon entry to the shell cannot be trapped or reset.
Run Code Online (Sandbox Code Playgroud)

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

捕获 CHLD 信号 - ZSH 有效,但 ksh/bash/sh 无效?