如何在 Linux 中查找和杀死僵尸进程

简介:这是在 Linux 中查找僵尸进程然后杀死它们的快速提示。 您还将了解有关进程和僵尸进程的一两件事。

在了解 Zombie 进程之前,让我回忆一下 Linux 中的进程是什么。

简而言之,一个 过程 是一个程序在性能上的运行实例。 它可以是前台(交互式进程)或后台(非交互式或自动进程)。 它可以是父进程(运行时其他进程的创建者)或子进程(由其他人创建的进程)。

在 Linux 中,除了第一个 PID 为 0 的 init(或 systemd)进程外,其他每个进程都有一个父进程。 进程也有自己的子进程。

不相信我? 使用 pstree 命令在终端查看进程树以查看系统进程的“家谱”。

Linux 中的僵尸进程是什么?

当子进程死亡时,会通知父进程,以便它可以进行一些清理,例如释放内存等。但是,如果父进程不知道其死亡,则子进程将进入僵尸状态。 对于父进程,子进程仍然存在,但子进程实际上已经死了。 这就是僵尸进程(也称为死进程)的创建方式并留在系统中。

这是 Turnoff.us 对僵尸进程的一个极好的有趣的看法:

你真的需要担心僵尸进程吗?

重要的是要说僵尸进程并不像它的名字听起来那么危险。

如果您的系统内存有限或者有太多僵尸进程占用内存,则可能会出现问题。 此外,大多数 Linux 进程可以将最大 PID 设置为 32768。如果其他生产任务没有可用的 ID,您的系统可能会崩溃。

这种情况很少发生,但有可能发生,特别是如果一个编码不当的程序开始诱导大量僵尸进程。

在这种情况下,最好找到并杀死僵尸进程。

如何找到僵尸进程?

Linux 中的进程可以具有以下状态之一:

  • D = 不间断睡眠
  • 我 = 空闲
  • R = 运行
  • S = 睡觉
  • T = 由作业控制信号停止
  • t = 在跟踪期间被调试器停止
  • Z = 僵尸

但是在哪里可以看到进程及其各自的状态? 一种简单的方法是使用终端和 顶部命令.

正如您在上面的屏幕截图中看到的,总共有 250 个任务(或进程),1 个正在运行,248 个进程在休眠,1 个处于僵尸状态。

现在,问题来了,如何杀死僵尸进程?

如何找到并杀死僵尸进程? 僵尸进程可以被杀死吗?

僵尸进程已经死了。 你如何杀死一个已经死的进程?

在僵尸电影中,你射击僵尸的头部或烧掉它。 这不是这里的一个选项。 你可以烧毁你的系统来杀死僵尸进程,但这不是一个可行的解决方案;)

有些人建议向父进程发送 SIGCHLD 信号。 但它更有可能被忽视。 杀死僵尸进程的另一个选择是杀死其父进程。 这听起来很残酷,但这是杀死僵尸进程的唯一可靠方法。

因此,首先,让我们列出僵尸进程以了解它们的 ID。 它可以通过 使用 ps 命令 像这样在终端。

ps ux | awk '{if($8=="Z+") print}'

ps ux 命令输出中的第 8 列显示进程的状态。 您要求打印进程状态为 Z+(指示僵尸状态)的所有匹配行。

确定其进程 ID 后,让我们获取其父进程 ID。

ps -o ppid= -p <child_id>

或者,您可以按以下方式组合上述两个命令,它直接提供僵尸进程的 PID 及其父进程的 PID。

ps -A -ostat,pid,ppid | grep -e '[zZ]'

在这里你得到了父进程 ID,所以最后通过在命令行中输入之前获得的相应 ID 进程来终止进程。

kill -9 <parent_process_ID>
杀死父进程

您可以通过再次运行 ps 命令甚至 top 命令来验证僵尸进程是否被杀死。

恭喜! 现在您知道如何消除僵尸进程了。

来自 Abhishek Prakash 的投入。