在儿童/后台进程中运行时,我无法捕获信号。
这是我的简单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后,它似乎正常工作......?
答案 0 :(得分:11)
OSX上的bash
联机帮助页(但在其他版本中应该是相同的)有关于信号处理的说法:
bash
运行的非内置命令将信号处理程序设置为值 shell从其父级继承。当工作控制不在时 效果,异步命令除了忽略SIGINT
和SIGQUIT
这些继承的处理程序。
以及trap
命令下的
进入shell时忽略的信号不能 被困或重置。
由于默认情况下脚本不使用作业控制,这意味着您正在谈论的情况。
答案 1 :(得分:3)
根据你的说明:
Signals ignored upon entry to the shell cannot be trapped or reset.
我注意到ZSH不会忽略在父进程和子进程之间来回发送的信号,但bash会这样做。这是我自己发布的问题: