Linux 中的僵尸进程是什么以及如何杀死它们
僵尸进程是封闭软件的残余物。以下是僵尸进程如何降低 Linux 系统速度以及如何杀死它们。
僵尸进程。并不是每个人都听说过这个与 Linux 操作系统相关的有趣而又可怕的词。在个人计算机上,僵尸进程可能不会对普通用户构成威胁,但在 Linux 服务器上,必须识别并停止这些进程。
此类进程可能会导致系统进程表出现问题,进而影响机器的正常运行。因此,在本文中,我们将详细讨论僵尸进程,以及在 Linux 计算机上查找和杀死僵尸进程的综合指南。
什么是僵尸进程?
但在此之前,了解僵尸进程到底是什么非常重要。这些只不过是占据系统进程表空间的死亡和失效的进程。进程控制块或 PCB 是一种数据结构,用于存储与系统上运行的各个进程相关的详细信息。
进程表由进程 ID、PCB 链接以及与进程相关的其他有用信息组成。僵尸进程有自己的进程ID和内存管理信息。由于Linux操作系统的可用进程ID数量有限,因此在僵尸进程停止之前其他进程无法使用PID。
尽管一两个僵尸进程不会对您的计算机造成任何中断或性能问题,但大量此类进程可能会淹没进程表和资源,从而损害系统的工作流程。
Linux 上出现僵尸进程的原因是什么?
要详细了解僵尸进程的根本原因,您必须了解 Linux 中进程如何启动和停止。 Linux 操作系统监视计算机上所有正在运行的进程和守护程序。 进程表是一个结构列表,其中包含当前在计算机上运行的所有进程。
进程表中的每个进程条目都包含指向该特定进程的进程控制块的链接。 PCB 存储与该特定过程相关的详细信息。这些细节包括:
进程状态:进程的当前状态
进程号:用于标识进程的唯一编号
程序计数器:包含与下一条指令相关的信息
寄存器:进程使用的所有CPU寄存器的列表
打开文件列表:进程使用的文件
CPU调度信息:包含与分配给进程的CPU时间和资源相关的信息
内存管理信息:包括进程使用的内存量的详细信息
I/O信息:进程使用的输入或输出设备列表
Linux 使用以下进程状态来描述其所有进程。
R:运行进程
S:睡眠过程
D:不间断的睡眠过程
T:终止进程
Z:僵尸进程
每当进程完成分配的任务时,其进程状态就会设置为Zombie或Z。每个进程都有一个父进程,它调用一系列名为 wait() 的函数来等待进程的状态更改。例如,如果进程状态从Running变为Zombie,则会触发wait()方法。
wait()方法通常会删除与该僵尸进程相关的进程控制块,然后从进程表中删除该进程的条目。
但有时,由于程序开发的不好,父进程没有调用wait()函数。因此,系统不会删除僵尸进程的PCB。该特定进程的进程表条目也保持不变。
这赋予了僵尸进程无限的生命周期。由于系统无法杀死进程,因此进程条目永远不会被删除,PID也永远不会被释放。
如何查找僵尸进程?
删除系统上的僵尸进程的第一步是分析哪个进程具有僵尸进程状态。虽然您无法直接终止这些进程,因为系统已将它们从内存中删除,但您可以终止与它们关联的父进程。
首先,您需要检查系统的进程表中是否存在僵尸进程。您可以使用top命令轻松完成此操作。只需打开您的终端并输入:
top
您将看到与此类似的输出。请注意终端窗口顶部的僵尸进程计数。如果输出为零,那么您就无需担心。
您可以通过使用 egrep 管道传输 ps 命令来列出与这些僵尸进程相关的信息。 Egrep 是 Linux 中 grep 命令的扩展,它将所有模式视为扩展的正则表达式字符串。
键入以下命令列出所有僵尸进程:
ps aux | egrep "Z|defunct"
上述命令将在 ps 命令生成的输出中查找包含 Z 或 defunct 的行。输出包含系统上运行的僵尸进程的列表。
使用kill命令杀死僵尸进程
现在您知道哪些僵尸进程当前正在消耗您的系统资源,是时候终止这些进程了。
虽然终止僵尸进程的最简单方法是重新启动计算机,但有时这不是一个可行的选择,特别是在您管理服务器时。
要在不关闭服务器的情况下杀死僵尸进程,请记下任何僵尸进程的进程 ID。从上一节中我们可以看到僵尸进程的PID是18614,然后利用这个PID找到父进程的ID。
ps -o ppid= -p 18614
输出 :
18613
使用ps命令验证父进程ID是否存在。
ps -e | grep 18613
现在我们已经确认了父进程的存在,是时候杀死它了。使用 kill 命令传递 -SIGKILL 标志,如下所示:
sudo kill -SIGKILL 18613
一旦您杀死了父进程,系统就会删除僵尸进程并自动将其从进程表中删除。
在 Linux 上高效管理进程
每个系统管理员都必须优先监控 Linux 计算机上运行的进程。尽管僵尸进程不一定对您的系统有害,但如果它们大量存在,则可能会导致性能问题。
如果您是 Linux 初学者,并且不知道 Linux 操作系统如何管理进程,那么首先了解什么是进程是一个不错的起点。