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从其父级继承的值.当作业控制无效,异步命令忽略SIGINT和SIGQUIT除了这些继承处理.
并进一步根据trap命令:
进入shell时忽略的信号不能被捕获或重置.
由于默认情况下脚本不使用作业控制,这意味着您正在谈论的情况.
根据您的注释:
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 无效?