top
通过类似和基于 GUI 的命令System Monitor
,我可以看到此刻我有几个僵尸进程。
什么是僵尸进程?
它们是否会影响系统或僵尸应用程序的性能。它们是否占用过多内存或根本不占用任何内存?
答案1
僵尸进程是死进程。它们无法被“杀死”(您无法杀死死进程)。所有进程最终都会死亡,当它们死亡时,它们就会变成僵尸进程。它们几乎不消耗任何资源,这是意料之中的,因为它们已经死了!僵尸进程存在的原因是为了使僵尸进程的父进程(进程)能够检索僵尸进程的退出状态和资源使用情况统计信息。父进程使用其中一个系统wait()
调用向操作系统发出信号,表示它不再需要僵尸进程。
当一个进程死亡时,它的子进程都将成为进程号 1 的子进程,即 init 进程。Init 是总是等待孩子们死去,这样他们就不会再像僵尸一样。
如果您有僵尸进程,则意味着这些僵尸进程的父进程没有等待它们(查看 显示的 PPID ps -l
)。您有三个选择:修复父进程(让其等待);终止父进程;或者忍受它。请记住,忍受它并不难,因为僵尸进程在 ps 的输出中只占用一行多一点的内容。
僵尸可以通过 Unix ps 命令输出中的 STAT 列中的“Z”来识别。存在时间较长的僵尸通常表示父程序中存在错误。与其他泄漏一样,少量僵尸的存在本身并不令人担忧,但可能表示在更重的负载下问题会变得更加严重。
要从系统中移除僵尸进程,可以使用 kill 命令手动向父进程发送 SIGCHLD 信号。如果父进程仍然拒绝收割僵尸进程,下一步就是移除父进程。当进程失去父进程时,init 将成为其新的父进程。Init 会定期执行 wait 系统调用来收割以 init 为父进程的任何僵尸进程。
还有孤立进程它们是其父进程已完成或终止的计算机进程。
当客户端进程在向服务器发出请求后崩溃时,远程调用期间进程可能会变为孤立进程。
孤儿进程浪费服务器资源,并可能导致服务器陷入困境(这是僵尸进程和孤儿进程之间最大的资源差异(除非你看过一些孤儿僵尸电影)。然而,孤儿进程问题有几种解决方案:
灭绝是最常用的技术;在这种情况下,孤儿进程会被终止。
轮回是一种技术,其中机器定期尝试定位任何远程计算的父进程;此时孤立进程将被终止。
到期是一种技术,其中每个进程在被终止之前都会被分配一定的时间来完成。如果需要,进程可以在分配的时间到期之前“请求”更多的时间来完成。
进程也可能是孤儿进程,但与其父进程在同一台机器上运行。在类 UNIX 操作系统中,任何孤儿进程都会立即被特殊的“init”系统进程收养。此操作称为重新指定父进程,并且会自动发生。尽管从技术上讲,进程的父进程是“init”进程,但它仍被称为孤儿进程,因为最初创建它的进程已不存在。
更多信息:
答案2
僵尸进程(也显示为<defunct>
)根本不是真正的进程。它们只是内核进程表中的条目。这是它们消耗的唯一资源。它们不消耗任何 CPU 或 RAM。僵尸进程的唯一危险是进程表空间不足(您可以使用它cat /proc/sys/kernel/threads-max
来查看系统上允许的条目数)。
它们仅当其父进程(即fork()'ed
其所属的进程)还活着,但尚未调用wait()
系统函数时才会出现。一旦父进程死亡,僵尸进程就会wait()'ed
消失init
。
答案3
当一个child process
进程终止时,它的死亡会被传达给它的父进程,以便父进程可以采取一些适当的措施。
那process
就是等待其父进程接受其返回代码被称为僵尸进程。
他们有completed their execution
,但仍然entry
有process table
。
答案4
您可以在第二行看到我的系统上有 1 个僵尸进程正在运行。
如果您想了解有关僵尸进程的更多详细信息,请使用以下命令:
$ ps axo stat,ppid,pid,comm | grep -w defunct
杀死僵尸进程:
$ kill -s SIGCHLD PID