23

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

他对此非常肯定,但我尝试了很多次,并没有发现这种情况。

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

4

5 回答 5

24

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

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

于 2009-09-29T10:17:27.367 回答
20

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

于 2009-09-29T10:21:06.537 回答
9

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

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

于 2009-09-29T10:48:53.383 回答
-1

如果您关闭作为进程的父进程 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

于 2015-01-06T05:42:07.093 回答
-11

你只需要知道你想杀死哪个进程或服务。在我的情况下,httpd 是。

killall -9 httpd

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

于 2011-08-20T15:27:43.270 回答