【发布时间】:2016-02-11 23:10:28
【问题描述】:
我的代码看起来像这样
function doTheThing{
# a potentially infinite while loop...
}
# other stuff...
doTheThing &
trap "kill $!" SIGINT SIGTERM
奇怪的是,当我在循环完成之前 ctrl-C 退出父进程时,我收到一条消息,指出该进程不存在。此外,如果我摆脱了陷阱,我无法使用 ps -aF 找到该进程。看起来后台进程在其父进程终止时被杀死,但我的理解是这不应该发生。我只是想确保我可以安全地避开陷阱并且不会到处留下僵尸进程。
【问题讨论】:
-
Control-C 杀死整个进程组,而不仅仅是进程。
-
僵尸进程是一个已经死亡但其父进程尚未调用
wait的进程。如果父级被杀死,僵尸会被init继承,等待它。 -
所以要明确一点,你是说如果我摆脱了陷阱,我不会留下任何额外的进程?
-
barmar 的意思是,如果这些进程仍在运行,它们就不是僵尸。如果您使用 ctrl-C 向进程组发送 SIGINT,那么子进程将收到信号。 (但可能不会终止。)但是如果您从另一个进程通过
kill发送信号,或者如果父进程因其他原因终止,它们不会。