多少僵尸太多(坏)

ton*_*ono 5 server

目前top在我的 Linux LVM 上运行,我看到 82 个僵尸。然后,一个小时后,我看到了 128 个僵尸。我知道僵尸是无害的,但多少是太多?他们可以开始引起问题吗?

Win*_*nix 4

它们不会造成任何严重的问题,除非它们开始以更快的速度繁殖。

\n
\n

这篇文章值得一读:

\n

- Linux 上的 \xe2\x80\x9cZombie Process\xe2\x80\x9d 是什么?

\n

在此输入图像描述

\n
\n

僵尸基本上是死进程的剩余部分,尚未被正确清理。创建僵尸进程的程序\nisn\xe2\x80\x99t 正确编程\xe2\x80\x93 程序\xe2\x80\x99t 不应该让僵尸\n进程继续存在。

\n
\n

什么\xe2\x80\x99是僵尸进程?

\n

要了解僵尸进程是什么以及导致僵尸进程出现的原因,您\xe2\x80\x99需要了解一些有关进程在Linux上如何工作的信息。

\n

当一个进程在Linux上死亡时,它并不会立即从内存中删除xe2x80x94,它的进程描述符仍然保留在内存中(进程描述符只占用很少的内存)。process\xe2\x80\x99s 状态变为 EXIT_ZOMBIE,并且 process\xe2\x80\x99s 父进程收到 SIGCHLD 信号通知其子进程已死亡。然后父进程应该执行wait()系统调用来读取死进程\xe2\x80\x99s的退出状态和其他信息。这允许父进程从死亡进程获取信息。调用 wait() 后,僵尸进程就会从内存中完全删除。

\n

这通常发生得非常快,因此您不会\xe2\x80\x99看到僵尸进程在系统上累积。但是,如果父进程没有正确编程并且从不调用 wait(),则其僵尸子进程将保留在内存中,直到它们被清理干净。

\n

GNOME 系统监视器、top 命令和 ps 命令等实用程序显示僵尸进程。

\n

僵尸进程的危险

\n

僵尸进程不会占用任何系统资源。(实际上,每个僵尸进程都使用非常少量的系统内存来存储其进程描述符。)但是,每个僵尸进程都保留其进程 ID (PID)。Linux 系统在 32 位系统上默认具有有限数量的进程 ID \xe2\x80\x93 32767。例如,如果僵尸进程以非常快的速度积累 \xe2\x80\x93,如果编程不当的服务器软件在负载下创建僵尸进程 \xe2\x80\x94,则整个可用 PID 池最终将分配给僵尸进程,从而阻止其他进程启动。

\n

然而,一些挂起的僵尸进程没有问题\xe2\x80\x93,尽管它们确实表明系统上的父进程存在错误。

\n

摆脱僵尸进程

\n

您可以 \xe2\x80\x99t 杀死僵尸进程,因为您可以使用 SIGKILL 信号杀死正常进程 \xe2\x80\x94 僵尸进程已经死亡。请记住,\xe2\x80\x99 不需要摆脱僵尸进程,除非你的系统上有大量\xe2\x80\x93 一些僵尸进程是无害的。但是,有几种方法可以消除僵尸进程。

\n

一种方法是向父进程发送 SIGCHLD 信号。该信号告诉父进程执行 wait() 系统调用并清理其僵尸子进程。使用kill命令发送信号,将下面命令中的pid替换为父进程\xe2\x80\x99s PID:

\n
kill -s SIGCHLD pid\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果父进程未正确编程并且忽略 SIGCHLD 信号,则这不会有帮助。您\xe2\x80\x99必须杀死或关闭僵尸\xe2\x80\x99父进程。当创建僵尸进程结束时,init 继承僵尸进程并成为它们的新父进程。(init 是 Linux 上启动时启动的第一个进程,分配的 PID 为 1。) init 定期执行 wait() 系统调用来清理其僵尸子进程,因此 init 可以快速处理僵尸进程。关闭父进程后可以重新启动它。

\n

如果父进程继续创建僵尸进程,则应对其进行修复,以便它正确调用 wait() 来获取其僵尸子进程。如果系统上的程序不断创建僵尸程序,请提交错误报告。

\n