当前位置: 首页>>技术教程>>正文


什么是僵尸进程?

, ,

问题描述

使用top和基于System Monitor的命令,我可以看到目前我有几个僵尸进程。

什么是僵尸进程?

它们是否会影响系统或僵尸程序的性能?他们是否使用太多内存或任何内存?

最佳解决方法

僵尸是DEAD过程。他们不能’kill'(你不能杀死DEAD)。所有进程最终都会死亡,当它们变成僵尸时。他们几乎不消耗任何资源,因为它们已经死亡,所以这是可以预料的。僵尸的原因是僵尸的父母(进程)可以检索僵尸的退出状态和资源使用统计。父母通过使用 wait()系统调用之一向操作系统发出信号,告诉它不再需要僵尸。

当进程死亡时,其子进程全部成为进程号1的子进程,这是init进程。 Init始终在等待孩子们死去,所以他们不会成为僵尸。

如果你有僵尸进程,这意味着这些僵尸并没有被父母等待(看看ps -l显示的PPID)。你有三个选择:修复父进程(让它等待);杀死父母;或与之共存。请记住,和它一起生活并不难,因为僵尸在ps的输出中只需要多出一行。

通过在STAT列中出现”Z”,可以在Unix ps命令的输出中识别僵尸。存在超过一段时间的僵尸通常表示父程序中存在一个错误。与其他泄漏一样,少数僵尸的存在本身并不令人担忧,但可能表明在较重负载下会出现严重问题。

要从系统中删除僵尸,可以使用kill命令手动将SIGCHLD信号发送到父级。如果父进程仍然拒绝收获僵尸,那么下一步就是删除父进程。当一个进程失去它的父节点时,init成为它的新父节点。 Init定期执行等待系统调用以获取任何具有init作为父项的僵尸。

还有孤儿进程是父进程已经完成或终止的计算机进程。

当进行服务器请求后客户端进程崩溃时,进程可能在远程调用期间变为孤立。

孤儿会浪费服务器资源并且可能会让服务器陷入困境(这是僵尸和孤儿之间最大的资源差异(除非你看到一些孤儿僵尸电影),但孤儿过程问题有几种解决方案:

  1. 灭绝是最常用的技术;在这种情况下,孤儿进程被终止。

  2. 轮回是一种技术,机器定期尝试定位任何远程计算的父母;在这一点上,孤立的进程被杀害。

  3. 到期是一种技术,其中每个进程在被杀之前分配一定的时间完成。如果需要一个过程可能”ask”有更多的时间在分配的时间到期之前完成。

一个进程也可以在与其父进程相同的机器上孤立运行。在UNIX-like操作系统中,特殊的”init”系统过程将立即采用任何孤立的过程。该操作称为re-parenting并自动发生。即使技术上该进程将”init”进程作为其父进程,但它仍被称为孤立进程,因为最初创建进程的进程不再存在。

更多信息:

http://wiki.answers.com/Q/What_is_Zombie_Process_and_Orphan_Process#ixzz1PCN9vojU

http://www.linuxsa.org.au/tips/zombies.html

http://www.brighthub.com/computing/linux/articles/79186.aspx

How to identify and kill hanging process, when system hangs and reacts slowly on user input?

Killing a running process in an Ubuntu machine remotely from a windows machine which is in LAN

次佳解决方法

僵尸进程(也显示为<defunct>)根本不是真正的进程。它们只是内核进程表中的条目。这是他们消费的唯一资源。它们不消耗任何CPU或RAM。有僵尸的唯一危险是在进程表中空间不足(可以使用cat /proc/sys/kernel/threads-max查看系统允许有多少个条目)。

它们仅在其父进程(即fork()'ed它们的进程)处于活动状态但尚未调用wait()系统函数时出现。一旦父母死亡,僵尸是由init wait()'ed并消失。

第三种解决方法

child process终止时,其死亡将传达给其父母,以便父母可以采取适当的措施。

等待其父代接受其返回码的process称为僵尸进程。

他们有completed their execution,但在process table中仍有entry

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/421.html,未经允许,请勿转载。