天天看点

如何在Linux上杀死僵尸进程

是什么导致Linux上的僵尸进程?

如何在Linux上杀死僵尸进程

写得不好的父进程可能不会调用该wait()创建子进程时, 函数。 这意味着没有任何东西在监视子进程中的状态变化,并且该SIGCHLD信号将被忽略。 或者,可能是由于不良的编程或恶意的意图,另一个应用程序正在影响父进程的执行。

但是,如果父进程不在子进程中监视状态变化,则不会发生适当的系统内务处理。 子进程终止时,不会删除PCB和进程表中的条目。 这导致僵尸状态永远不会从PCB上移除。

僵尸确实会占用一些内存,但通常不会造成问题。 进程表中的条目很小,但是在发布之前,进程ID无法重用。 在64位操作系统上,这不太可能引起任何问题,因为PCB比工艺表条目大得多。

可以想象,大量的僵尸可能会影响可供其他进程使用的内存量。 但是,如果您有那么多僵尸,那么父应用程序或操作系统错误就是一个严重的问题。

如何删除僵尸进程

您无法杀死僵尸进程,因为它已经死了。 它不会对任何信号做出响应,因为它已从内存中删除了-无处发送SIGKILL信号。 您可以尝试将 发送SIGCHLD信号 给父进程,但是如果子进程终止时它不起作用,那么现在也不大可能起作用。

唯一可靠的解决方案是杀死父进程。 终止时,其子进程将被该 继承init进程 ,这是在Linux系统中运行的第一个进程(其进程ID为1)。

该init进程定期执行必要的清理僵尸的操作,因此要杀死它们,您只需杀死创建它们的进程即可。 该top命令是查看是否有僵尸的便捷方法。

输入以下内容:

如何在Linux上杀死僵尸进程

该系统具有八个僵尸进程。 我们可以 列出来列出它们 通过使用 通过ps命令并将其 管道 egrep。 同样,僵尸进程的状态标志为“ Z”,您通常还会看到“已失效”。

输入以下内容:

如果你在学习C/C++的过程中遇到了问题,可以来加入小编的企鹅圈问小编哦~小编很热情的(●’◡’●)​​​​​​​

ps aux | egrep“ Z |已终止”

如何在Linux上杀死僵尸进程

列出了僵尸进程。

如何在Linux上杀死僵尸进程

与来回滚动浏览相比,这是发现僵尸进程ID的一种更巧妙的方法top。 我们还看到一个名为“ badprg”的应用程序产生了这些僵尸。

第一个僵尸的进程ID是7641,但是我们需要找到其父进程的进程ID。 我们可以 使用ps再次 。 我们将使用输出选项(-o)告知ps仅显示父级的进程ID,然后将其与 一起传递ppid=标志 。

我们要查找的进程将使用 指示-p(process)选项 ,然后传入僵尸的进程ID。

因此,我们键入以下命令以查找进程7641的进程信息,但它将仅报告父进程的ID:

ps -o ppid = -p 7641

如何在Linux上杀死僵尸进程

我们被告知父进程ID为7636。我们现在可以 使用它来交叉引用它ps再次 。

如何在Linux上杀死僵尸进程

我们看到这与之前的父进程的名称匹配。 要终止父进程,请在kill命令中使用SIGKILL选项,如下所示:

杀死-SIGKILL 7636

根据父流程的所有者,您可能还需要使用sudo。

僵尸并不可怕……

…除非他们陷入大群。 没什么可担心的,只需重新启动即可清除它们。

但是,如果您发现某个应用程序或进程始终在生成僵尸,则应注意这一点。 它很可能只是一个草率的程序,在这种情况下,也许有一个更新的版本可以在子进程之后正确进行清理。

继续阅读