【问题标题】:When a parent process is killed by "kill -9", will subprocess also be killed?当父进程被“kill -9”杀死时,子进程也会被杀死吗?
【发布时间】:2010-12-02 06:39:05
【问题描述】:

今天早上我的一位同事告诉我,当他用“kill -9”杀死supervisord时,supervisord的子进程没有被杀死。

他对此很确定,但我试了很多次,都没有发现。

那么当一个父进程被“kill -9”杀死时,linux会确保它的子进程也被杀死吗?

【问题讨论】:

    标签: linux process signals kill


    【解决方案1】:

    不,当父进程被杀死时,子进程不一定会被杀死。

    但是,如果子进程打开了一个正在写入的管道,而父进程正在从中读取数据,那么当它下一次尝试写入管道时,它将获得一个 SIGPIPE,默认操作是终止它。这在实践中经常发生。

    【讨论】:

      【解决方案2】:

      您必须使子进程成为守护进程,以便在父亲被杀死(或死亡)时杀死它们,否则它们会被 init(1) 采用。

      【讨论】:

      • 如果您对如何创建僵尸进程感兴趣并尝试如何为您的系统处理它们,这里是如何创建僵尸进程的链接:unix.com/unix-dummies-questions-answers/…
      • 守护进程、父进程、父进程、子进程和僵尸进程。计算机讲述了这样一个有趣而异想天开的故事。
      【解决方案3】:

      在 UNIX 上,父进程和子进程的生命周期之间没有强制关系。严格来说,进程只有在调用 exit() 或接收到默认操作将终止的未处理信号时才会终止。

      但是,当用户在 那个 终端上按 ctrl-C、ctrl-\ 等时,“控制终端”中的整个“前台进程组”可以接收到 SIGINT 和 SIGQUIT 等信号。特定行为部分由登录 shell 实现(在 tty 驱动程序的帮助下)。细节可能相当复杂:看herehere

      【讨论】:

        【解决方案4】:

        你只需要知道你想杀死哪个进程或服务。就我而言,httpd 是。

        killall -9 httpd
        

        它会杀死httpd的所有子进程。

        【讨论】:

        • 这篇文章没有回答提出的问题,因为其他答案可以,你可能希望删除这篇文章。
        【解决方案5】:

        如果您关闭作为进程的父进程 ID 的终端 pid,则终端将关闭。当终端关闭时,它的所有进程也会被杀死。但是,如果你在 shell 中创建一个子 shell,那么如果你创建任何进程并杀死该进程的 ppid,那么只有那个子 shell 会被杀死,并且他们的孩子会成为孤儿。它们的父级变为 init 且 pid 为 1。

        [实习生@SIPL ~]$ ps -ef | grep sleep 实习生 3893 3870 0 10:55 pts/1 00:00:00 sleep 4000 实习生 3895 3788 0 10:55 pts/0 00:00:00 grep --color=auto sleep [trainee@SIPL ~]$ kill - 9 3870 [实习生@SIPL ~]$ ps -ef | grep sleep 实习生 3893 1 0 10:55 pts/1 00:00:00 sleep 4000 实习生 3906 3788 0 10:55 pts/0 00:00:00 grep --color=auto sleep

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-09
          • 2010-12-08
          • 1970-01-01
          • 2010-09-28
          • 2013-09-19
          相关资源
          最近更新 更多