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

什么是僵尸进程?

它们是否会影响僵尸进程的性能?系统或他们僵尸的应用程序。他们使用过多的内存还是根本没有使用任何内存?

评论

他们是想要吃掉CPU的进程;)

午餐... :)

这些过程已死,但未被掩埋。

吃我的CPU?真是吓人!

#1 楼

僵尸是DEAD进程。它们不能被“杀死”(您不能杀死DEAD)。所有过程最终都会死亡,并且当它们变成僵尸时。它们几乎不消耗资源,这是预料之中的,因为它们已经死了!造成僵尸的原因是僵尸的父级(进程)可以检索僵尸的退出状态和资源使用情况统计信息。父进程使用wait()系统调用之一向操作系统发出信号,通知它不再需要僵尸。

当一个进程死亡时,其子进程全部成为进程号1的子进程。初始化过程。 Init总是在等待孩子的死亡,这样他们就不会再成为僵尸了。

如果您有僵尸进程,则意味着这些僵尸没有被父母等待在由ps -l显示的PPID处)。您有三个选择:修复父进程(使其等待);杀死父母或忍受它。请记住,使用它并不难,因为僵尸在ps输出中只占用一行多余的一行。

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

要从系统中删除僵尸,可以使用SIGCHLD信号使用kill命令手动发送给父级。如果父进程仍然拒绝收割僵尸,则下一步将是删除父进程。当进程失去其父级时,init会成为其新的父级。 Init定期执行wait系统调用,以用init作为父级来收获所有僵尸。

也有一些孤儿进程,它们是计算机进程,其父进程已完成或终止。

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

孤立进程浪费了服务器资源,并有可能使服务器陷入困境(这是僵尸之间最大的资源差异)和孤儿(除非您看过一些孤零零的僵尸电影)。但是,有几种解决孤儿过程问题的方法:


消灭是最常用的技术;在这种情况下,孤儿过程
轮回是一种技术,其中机器定期尝试定位任何远程计算的父级;此时,孤立的进程被杀死。
到期是一种技术,其中每个进程都分配有一定数量的资源。在被杀死之前需要完成的时间。如果需要的话,一个进程可能会“要求”在分配的时间到期之前完成更多的时间。

也可以孤立一个进程与其父进程在同一台计算机上运行。在类似UNIX的操作系统中特殊的“ init”系统过程将立即采用任何孤立过程。此操作称为重新父母化,并且会自动发生。即使从技术上讲,该进程将“ 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

当系统挂起并对用户输入作出缓慢反应时,如何识别并杀死挂起进程?

从局域网中的Windows计算机远程杀死Ubuntu计算机中的正在运行的进程

评论


kh!您可以杀死死者!您只需要瞄准头部。还是他们一直在骗我们?

– Marcin Kaminski
2012年11月29日在2:50

init调用会等待其所有子进程,是僵尸,孤儿(已采用)还是生物学(自产)?

–手指出血
13-10-18在17:53

符合参加第二次世界大战时使用伪装:P

–عثمانغني
2014年2月11日在6:10



请给@MarcinKaminski奖章!

– Andrea
16年6月29日在9:22

#2 楼

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

它们仅在其父进程(即,fork()'ed所在的进程)处于活动状态但尚未调用wait()系统函数时显示。一旦父母去世,僵尸就变成wait()'ed并消失。

评论


这个问题的顶级屏幕截图似乎与您矛盾?在那里,僵尸似乎使用了1个CPU的100%,但没有内存。

– Torben Gundtofte-Bruun
11年7月22日在11:40

#3 楼

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

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

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

#4 楼

僵尸进程是已经停止运行的进程,但是它们的进程表条目仍然存在,因为父进程尚未通过wait syscall检索到它。从技术上讲,每个终止的进程在很短的时间内都是僵尸,但是它们可以生存更长的时间。

当子进程拥有父进程的进程不调用wait syscall时,僵尸进程的寿命就会更长完成。发生这种情况的一种情况是,当父进程的编写不佳,只是省略了wait调用,或者当父进程在子进程之前死亡而新的父进程没有对其调用wait时。当进程的父进程在子进程之前死亡时,操作系统会将子进程分配给“ init”进程或PID1。即,init进程“采用”子进程并成为其父进程。这意味着现在子进程退出时,新的父进程(init)必须调用wait来获取其退出代码,否则其进程表条目将永远保留并成为僵尸