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

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

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

使用pstree命令在终端中的查看进程树,也可以查看系统进程的“族普”。在本教程中将说明如何在Linux中查找和杀死僵尸进程。

在Linux中什么是僵尸进程?

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

我们需要担心僵尸进程吗?

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

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

这种情况很少发生,但有可能发生,特别是如果一个编码不当的程序开始产生大量僵尸进程。在这种情况下,最好找到并杀死僵尸进程。

如何找到僵尸进程?

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

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

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

顶部命令视图
top 命令显示进程及其状态

正如您在上面的屏幕截图中看到的,总共有 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 命令来验证僵尸进程是否被杀死。

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