一种僵尸或一个失效的过程在Linux中,该进程已经完成,但是由于父进程和子进程之间没有对应关系,因此其条目仍保留在进程表中。通常,父进程通过 wait()函数检查其子进程的状态。子进程完成后,等待功能会通知父进程完全从内存中退出该进程。但是,如果父级未能为其任何子级调用wait函数,则子级进程将作为死进程或僵尸进程在系统中保持活动状态。这些僵尸进程可能大量堆积在您的系统上,并影响其性能。在这种情况下,您可能必须通过本教程中介绍的方法和命令手动杀死这些僵尸。
查看僵尸进程
您可以通过查看系统上运行的各种进程(包括更改僵尸进程的效率)来检查系统性能。 Ubuntu使您可以通过以下方式查看这些过程:
- 通过图形用户界面
- 通过命令行
通过GUI
为了以图形方式查看系统上运行的所有僵尸进程,请打开系统监控器实用程序通过您的Ubuntu Dash。在我的系统监视器的以下屏幕截图中,您可以查看我的系统上正在运行两个僵尸。您系统上的僵尸进程的数量也可能少于或大于我的僵尸进程的数量。
通过命令行
的最佳命令显示系统上正在运行的进程以及它们正在使用的内存和CPU资源的详细视图。它还为您提供有关系统上运行的所有僵尸进程的信息。通过按打开终端Ctrl + Alt + T然后输入最佳。运行此命令后,得到以下输出。
$ top
您可以在第二行看到我的系统上正在运行1个僵尸进程。
如果您想要有关僵尸进程的更多详细信息,请使用以下命令:
$ ps axo stat,ppid,pid,comm | grep -w defunct
此命令将为您提供状态,parentID,进程ID,正在运行僵尸进程的程序(在我的系统上名为“ zombie”的虚拟程序)。失效标志告诉您这是一个僵死的僵尸进程。
杀死Zombie-Process
首先,让我们了解僵尸进程如何威胁到我们系统的性能。重要的是要知道僵尸已经死了,并且大多数已完成的进程不占用内存或CPU资源。但是,每个进程都分配有唯一的进程ID,该ID来自为您的处理器保留的有限PID池。如果大量僵尸聚集在一起,它们将消耗掉PID池的大部分,并且由于缺少进程ID,新进程将无法启动。
少量已消失的程序占据了您的系统不是很大的威胁,但这意味着它们的父程序由于错误或缺少 wait()函数而无法将其取消。
当父进程无法自动调用 wait()函数时,我们需要手动向父进程发出信号,以在其所有子进程上运行wait函数,以便可以调用具有完整状态的子进程。我们可以通过运行SIGCHLD命令来做到这一点。如果不起作用,我们可以手动杀死父进程,以便杀死其所有僵尸子进程,从而为新进程释放进程ID。
您可以通过以下方式杀死僵尸进程:
- 通过图形用户界面
- 通过命令行
通过GUI
您可以通过“系统监视器实用程序”以图形方式杀死僵尸进程,如下所示:
- 打开系统监控器实用程序通过Ubuntu Dash。
- 搜索词僵尸通过搜索按钮。
- 选择僵尸进程right-click,然后选择杀从菜单中。
僵尸进程将从您的系统中删除。
通过命令行
通过top命令知道系统上正在运行任何僵尸进程后,请查看这些进程的详细信息。
通常的方法是使用以下命令来向僵尸的父进程发出信号,以杀死该命令。
$ kill -s SIGCHLD PID
在某些情况下,此命令可能无法使用,因为并非所有父进程都已正确编程,以便检查子进程。在这种情况下,您可以通过以下命令终止父进程:
$ sudo kill -9 3376
通过这种方式杀死了所有僵尸进程并运行top命令后,您将能够看到系统上不再运行任何僵尸进程:
在学习完本教程之后,您可以通过在系统上查找任何僵尸进程并通过命令行或图形用户界面手动将其杀死来优化操作系统。此操作将为您要在系统上运行的新进程释放进程ID。