在子进程/后台进程中运行时无法捕获信号。
下面是我的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从父进程继承。当作业控制不在时因此,异步命令除了忽略SIGINT
和SIGQUIT
之外,还会忽略这些继承的处理程序
和trap
命令下的
进入shell时被忽略的信号不能被困或重置
由于脚本默认情况下不使用作业控制,这意味着您正在讨论的情况
按你的注释:
Signals ignored upon entry to the shell cannot be trapped or reset.
我注意到ZSH不会忽略父进程和子进程之间来回发送的信号,但是bash会。这是我自己发的问题:
捕获CHLD信号- ZSH工作,但ksh/bash/sh don't?