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