如果我有以下 shell 脚本
sleep 30s
Ctrl+C当 shell 脚本运行时,我点击sleep
了它,它就死了。
如果我有以下 shell 脚本
sleep 30s &
wait
我Ctrl+C在 shell 脚本运行时点击,sleep
继续,现在有一个 1 的父级。
这是为什么?bash 不会传播Ctrl+C到所有孩子吗?
编辑:如果我有以下脚本
/usr/bin/Xvfb :18.0 -ac -screen 0 1180x980x24 &
wait
在我生成一个程序的地方,这次Ctrl+C在主进程上Xvfb
也会杀死该进程。
那么如何/为什么Xvfb
与睡眠不同?
在某些进程的情况下,我看到它们被 收割init
,在某些情况下它们会死掉。为什么睡眠会被 init 收割?为什么会Xvfb
死?
tl;博士; 该
Xvfb
进程设置一个信号处理程序SIGINT
并在它接收到这样的信号时退出,但该sleep
进程没有,因此它继承了“忽略”状态,SIGINT
因为它是由运行脚本的shell在执行sleep
二进制文件之前设置的。当 shell 脚本运行时,作业控制被关闭,后台进程(以 开头的
&
)只是在同一个进程组中运行,SIGINT
并SIGQUIT
设置为SIG_IGN
(忽略)并且它们的标准输入从/dev/null
.这是标准要求的:
如果信号处置设置为
SIG_IGN
(忽略),则该状态将通过fork()
and继承execve()
:从bash 手册页:
你可以用不同的方式来处理它;首先,杀死列出的工作:
或者,向同一进程组中的所有进程发送终止:
Bash 不会将 SIGINT 或 SIGTERM 之类的信号转发给它当前正在等待的进程。
一种常见的解决方法是执行陷阱等待等待,如下例所示: