6

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

 2 years ago
source link: https://www.myfreax.com/how-to-find-and-kill-zombie-processes-in-linux/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

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

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

在Linux中什么是僵尸进程?

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

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

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

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

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

如何找到僵尸进程?

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

  • D = 不间断睡眠
  • T = 由作业控制信号停止
  • t = 在跟踪期间被调试器停止

但是在哪里可以看到进程及其各自的状态?一种简单的方法是使用终端和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 命令来验证僵尸进程是否被杀死。

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK