如何在 Ubuntu 18.04 LTS 中杀死僵尸进程

一个 僵尸 或一个 已失效的进程 在Linux中是一个已经完成的进程,但是由于父子进程之间缺乏对应关系,它的条目仍然保留在进程表中。 通常,父进程通过 wait() 函数检查其子进程的状态。 当子进程完成时,等待函数向父进程发出信号以完全退出内存中的进程。 但是,如果父进程未能为其任何子进程调用等待函数,则子进程在系统中仍作为死进程或僵尸进程保持活动状态。 这些僵尸进程可能会在您的系统上大量堆积并影响其性能。 在这种情况下,您可能必须通过本教程中描述的方式和命令手动杀死这些僵尸。

查看僵尸进程

您可以通过查看系统上运行的各种进程(包括改变效率的僵尸进程)来检查系统性能。 Ubuntu 允许您以下列方式查看这些进程:

  • 通过图形用户界面
  • 通过命令行

通过图形用户界面

为了以图形方式查看系统上运行的任何僵尸进程,请打开 系统监视器 通过您的 Ubuntu Dash 实用程序。 在我的系统监视器的以下屏幕截图中,您可以看到有两个僵尸在我的系统上运行。 您系统上的僵尸进程数量也可能少于或多于我的系统上运行的僵尸进程。

通过命令行

最佳 命令显示系统上运行的进程的详细视图以及它们正在使用的内存和 CPU 资源。 它还为您提供有关系统上运行的任何僵尸进程的信息。 通过按打开终端 Ctrl+Alt+T 然后输入 最佳. 运行此命令后,我得到以下输出。

$顶部

在命令行上查找僵尸进程

您可以在第二行中看到我的系统上正在运行 1 个僵尸进程。

如果您想了解有关僵尸进程的更多详细信息,请使用以下命令:

$ ps axo stat,ppid,pid,comm | grep -w defunct

获取有关 Linux 上的僵尸进程的详细信息

此命令将为您提供状态、父 ID、进程 ID、正在运行僵尸进程的程序(在我的系统上名为“僵尸”的虚拟程序)。 defunct 标志告诉你这是一个死的僵尸进程。

杀死僵尸进程

首先,让我们了解僵尸进程如何威胁我们系统的性能。 重要的是要了解僵尸是死的并且大部分已完成的进程不占用内存或 CPU 资源。 但是,这些进程中的每一个都有一个分配给它们的唯一进程 ID,该 ID 来自为您的处理器保留的有限 PID 池。 如果僵尸大量聚集,它们会吃掉大部分 PID 池,新进程将由于缺少进程 ID 而无法启动。

占用您系统的少量已失效程序并不是什么大威胁,但这意味着它们的父程序由于错误或缺少 wait() 函数而无法将它们关闭。

当父进程无法自动调用 wait() 函数时,我们需要手动通知父进程在其所有子进程上运行等待函数,以便回调具有完整状态的子进程。 我们可以通过运行 SIGCHLD 命令来做到这一点。 当这不起作用时,我们可以手动杀死父进程,以便它的所有僵尸子进程也被杀死,从而为新进程释放进程 ID。

您可以通过以下方式杀死僵尸进程:

  • 通过图形用户界面
  • 通过命令行

通过图形用户界面

您可以通过系统监视器实用程序以图形方式杀死僵尸进程,如下所示:

  1. 打开 系统监视器 通过 Ubuntu Dash 实用程序。
  2. 搜索词 僵尸 通过 搜索 按钮。
  3. 选择僵尸进程,右键然后选择 从菜单中。

如何杀死 Linux 桌面上的僵尸进程

僵尸进程将从您的系统中被杀死。

通过命令行

在通过 top 命令知道系统上运行了任何僵尸进程后,查看进程的详细信息。

通常的方法是使用下面的命令来通知僵尸的父进程杀死该命令。

$ kill -s SIGCHLD PID

此命令在少数情况下可能不起作用,因为并非所有父进程都已正确编程以检查子进程。 在这种情况下,您可以通过以下命令杀死父进程:

$ sudo kill -9 3376

在命令行中杀死一个僵尸进程

当您通过这种方式杀死所有僵尸进程并运行 top 命令时,您将能够看到您的系统上不再有僵尸进程运行:

僵尸进程被杀死

学习完本教程后,您可以通过查找系统上的任何僵尸进程并通过命令行或图形用户界面手动杀死它们来优化您的操作系统。 此操作将为您要在系统上运行的新进程释放进程 ID。