Linux如何处理僵尸进程


12

僵尸进程是在Unix / Linux系统中创建的。我们可以通过kill命令将其删除。

但是Linux中是否有任何内置的清理机制来处理僵尸进程?

Answers:


18

僵尸进程已经死亡。你不能杀死他们。该kill命令或系统调用对僵尸进程没有影响。(您可以让僵尸离开kill,但您必须射击父母,而不是射击僵尸,正如我们稍后会看到的。)

僵尸进程实际上不是一个进程,它只是进程表中的一个条目。僵尸进程没有其他资源:它没有任何内存或任何正在运行的代码,它没有打开任何文件,等等。

当进程终止时,清除所有其他资源后,最后要做的就是进程表中的条目。该条目会保留,形成一个僵尸,以允许父进程跟踪子进程的退出状态。父级通过调用waitsyscall系列之一来读取退出状态。此时,僵尸消失了。wait据说打来电话可以收割孩子,扩大了僵尸死了的比喻,但在某种程度上仍无法完全解决来世。父级也可以表示它不在乎(通过忽略SIGCHLD信号,或通过sigaction使用SA_NOCLDWAIT标志进行调用),在这种情况下,进程表中的条目将在子级死亡时立即删除。

因此,僵尸仅在进程死亡且其父进程尚未调用时才存在wait。只要父级仍在运行,此状态就可以持续。如果父母在孩子之前死亡或在未读取孩子状态的情况下死亡,则将僵尸的父进程设置为PID为1的进程init。的一项工作initwait循环调用,从而获得其父级留下的任何僵尸进程。


6

您没有kill僵尸进程,因为它已经死了。

僵尸进程必须wait由其父母编辑,以便收集其退出状态。

Linux中唯一的“内置清理机制”适用于任何父进程在收集其子级退出状态之前死亡的情况。在这种情况下,init进程将继承每个子进程,该进程将wait在该子进程上收集其退出状态并在进程表中删除其条目。


3

一旦进程的父进程去世,该进程将成为一个孤儿-不管它是否是僵尸。孤儿会怎样?他们有了一个新父母,名为initinitwait在收集到的每个孤儿上进行收割,从而收获孤儿(也可能是僵尸)。


1
init不。要精确,不会杀死任何进程。它只是wait依靠孩子来收集自己的身份。
chrk 2014年

1
@chrk,菲利普:通常的说法是reap
吉尔斯(Gilles)'所以别再邪恶了'

1

不,没有内置的僵尸清洁机制。一旦其父母被杀,僵尸便进入僵尸天堂。在此之前,操作系统会保留它们以将退出状态返回给父级。


所以..这对记忆等没有负面影响吗?

1
实际上,当僵尸模具的母公司,该init过程将接管并调用wait

不,除了进程表中的条目外,所有分配给该进程的资源都被释放。
unxnut
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.