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

    $./test1.sh

  • 打开新控制台并挂起子进程

    $kill-19或kill-20

  • 杀死父进程test1.sh

    $kill

  • 在步骤3之后,test2.sh和sleep 600退出

    Bug如果我只运行步骤1和步骤3,忽略步骤2,test2.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的进程,并在终止时重新生成它(但执行将再次开始)。