Linux 如果父进程退出,则挂起子进程退出
我有下面的过程树Linux 如果父进程退出,则挂起子进程退出,linux,bash,shell,process,Linux,Bash,Shell,Process,我有下面的过程树 test1.sh \- test2.sh \- sleep 600 通常,如果我终止test1.sh进程,子进程test2.sh和sleep 600将继续运行。但是如果我通过send signal(SIGSTOP或SIGTSTP)暂停sleep 600进程,然后杀死test1.sh进程,那么子test2.sh和sleep 600将退出。为什么? 这是我的测试程序: test1.sh #!/bin/sh ./test2.sh #!/bin/sh sleep
test1.sh
\- test2.sh
\- sleep 600
通常,如果我终止test1.sh进程,子进程test2.sh和sleep 600将继续运行。但是如果我通过send signal(SIGSTOP或SIGTSTP)暂停sleep 600进程,然后杀死test1.sh进程,那么子test2.sh和sleep 600将退出。为什么?
这是我的测试程序:
test1.sh
#!/bin/sh
./test2.sh
#!/bin/sh
sleep 600
test2.sh
#!/bin/sh
./test2.sh
#!/bin/sh
sleep 600
测试步骤:
有人能解释一下吗?非常感谢。当您终止进程
test1.sh
时,您会离开test2.sh
孤立进程,因此您需要了解操作系统中孤立进程的情况
当进程test2.sh
正在运行且其父进程死亡时,操作系统将其移动到init进程并保持其执行。因此,结果是,test2.sh
和sleep
进程仍然处于运行状态,即使您已终止test1.sh
当进程sleep
停止(信号20)并且其父进程死亡时,操作系统会尝试将其移动到init进程。但是,由于进程已停止,并且不再有任何tty能够恢复进程(因为其父进程已死亡),因此操作系统可能会决定对进程执行其他操作。在您的例子中,它与SIGKILL一起消亡,以避免系统中存在许多已停止的孤立进程的问题。由于sleep
进程已退出,test2.sh
进程也将结束
从GNU手册页:
当进程停止时,无法向其发送更多信号
直到它继续,除了SIGKILL信号和(显然)SIGCONT
信号。信号被标记为挂起,但直到
这一进程仍在继续。SIGKILL信号总是导致终止
无法阻止、处理或忽略。你可以
忽略SIGCONT,但它总是导致进程继续
不管怎样,如果它停止了。向进程发送SIGCONT信号会导致
要丢弃该进程的任何挂起的停止信号。同样地
进程的任何挂起的SIGCONT信号在启动时都将被丢弃
接收停止信号
当孤立流程组中的某个流程(请参见孤立流程
组)接收SIGTSTP、SIGTTIN或SIGTTOU信号,但不
处理它,过程不会停止。停止这一进程可能会
可能不是很有用,因为没有shell程序可以
请注意,它将停止并允许用户继续。会发生什么
取决于您使用的操作系统。有些系统可以
没有什么;其他人可能会发送另一个信号,例如SIGKILL或
叹气。在GNU/Hurd系统上,进程以SIGKILL结束;这
避免了许多已停止的孤立进程的问题
系统
顺便说一句,如果你愿意随时杀死它们,你可以在主进程上添加一个
陷阱
,以捕获信号并正确退出子进程。太糟糕了,另一个站点列表没有。我们可以让挂起的子进程继续运行(挂起)吗即使父进程退出?如果该进程因资源使用或内存而终止,您也可以避免。然而,由于这是一个内核策略,我认为您无法更改它。也就是说,您可以创建一个分叉test1.sh的进程,并在终止时重新生成它(但执行将再次开始)。