僵尸太多了会怎样(不好)

僵尸太多了会怎样(不好)

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

答案1

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


这篇文章很值得一读:

-Linux 上的“僵尸进程”是什么?

在此处输入图片描述

僵尸进程基本上是死进程的残留部分,没有得到妥善清理。创建僵尸进程的程序没有经过妥善编程——程序不应该让僵尸进程继续存在。

什么是僵尸进程?

要了解什么是僵尸进程以及导致僵尸进程出现的原因,您需要了解一些有关 Linux 上进程的工作方式。

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

这通常发生得非常快,所以你不会看到僵尸进程在你的系统上积累。但是,如果父进程没有正确编程并且从不调用 wait(),它的僵尸子进程将一直停留在内存中,直到它们被清理。

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

僵尸进程的危险

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

然而,一些僵尸进程徘徊并不是什么问题——尽管它们确实表明你的系统上的父进程有错误。

摆脱僵尸进程

您无法像使用 SIGKILL 信号杀死正常进程那样杀死僵尸进程 — 僵尸进程已经死了。请记住,除非您的系统上有大量僵尸进程,否则您无需清除僵尸进程 — 少量僵尸进程是无害的。但是,有几种方法可以清除僵尸进程。

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

kill -s SIGCHLD pid

但是,如果父进程编程不正确并且忽略了 SIGCHLD 信号,那么这将无济于事。您必须杀死或关闭僵尸进程的父进程。当创建僵尸进程的进程结束时,init 将继承僵尸进程并成为它们的新父进程。(init 是 Linux 启动时启动的第一个进程,分配的 PID 为 1。)init 定期执行 wait() 系统调用来清理其僵尸子进程,因此 init 将很快处理僵尸进程。您可以在关闭父进程后重新启动它。

如果父进程继续创建僵尸进程,则应进行修复,以便它能够正确调用 wait() 来收割其僵尸子进程。如果系统上的某个程序继续创建僵尸进程,请提交错误报告。

相关内容