如果你经常使用Linux,你应该会遇到术语僵尸进程。那么什么是僵尸进程呢?它们是如何形成的?它们对系统有害吗?我如何杀死这些进程?下面会回答这些问题。

什么是僵尸进程?我们都知道这个过程是如何运作的。我们启动一个程序,开始我们的任务,然后在任务结束时停止进程。当流程停止时,它将从流程表中移除。

您可以通过系统监视器检查当前进程。

然而,有时一些程序甚至在执行后仍保留在进程表中。

那么,这些已经完成生命周期,但仍留在流程表中的流程,就叫做“僵尸流程”。

它们是如何形成的?当你运行一个程序时,它会产生一个父进程和许多子进程。所有这些子进程都会消耗内核分配给它们的内存和CPU资源。

当这些子进程完成执行时,它们将发送一个退出信号,然后死亡。这个退出信号需要被父进程读取。父进程需要调用wait命令来读取子进程的退出状态,并将子进程从进程表中删除。

如果父进程正确读取子进程的退出信号,子进程将从进程表中删除。

但是,如果父进程未能读取子进程的退出信号,尽管子进程在执行后处于死亡状态,但它不会从进程表中删除。

僵尸进程对系统有害吗?不会。因为僵尸进程什么都不做,不使用任何资源,也不影响其他进程,所以僵尸进程的存在没有任何害处。但是,因为进程表中的退出状态和其他进程信息也存储在内存中,所以僵尸进程太多有时会是一个问题。

你可以这样想象:

“你是一家建筑公司的老板。你每天根据工人的工作量付给他们工资。有一个工人,每天来工地,坐在那里。你不用付钱,他也不做任何工作。他只是每天来,只是坐在那里,仅此而已!”

这个工人就是僵尸进程的一个活生生的例子。但是,如果你有很多僵尸工人,你的工地就会拥堵,正常工人很难工作。

那么如何找到僵尸进程呢?打开终端并输入以下命令:

psaux|grepZ

列出了进程表中所有僵死进程的详细信息。

如何杀死僵尸进程?

一般情况下,我们可以用SIGKILL信号杀死进程,但是僵尸进程是死的,你杀不死那个东西。因此,您需要输入的命令应该是

kill-sSIGCHLDpid

用父进程的进程id替换这里的pid,这样父进程将删除所有已完成的和死的子进程。

你可以把它想成:

“你在路中间发现了一具尸体,于是你联系了死者家属,然后他们会把尸体抬出马路。”

但是很多程序并没有写的那么好,你无法删除这些子僵尸(否则你不会在第一时间看到这些僵尸)。所以确保子僵尸被删除的唯一方法就是杀死它们的父进程。