写得不好的父进程可能不会调用该wait()创建子进程时, 函数。 这意味着没有任何东西在监视子进程中的状态变化,并且该SIGCHLD信号将被忽略。
或者,可能是由于不良的编程或恶意的意图,另一个应用程序正在影响父进程的执行。
但是,如果父进程不在子进程中监视状态变化,则不会发生适当的系统内务处理。 子进程终止时,不会删除PCB和进程表中的条目。 这导致僵尸状态永远不会从PCB上移除。
僵尸确实会占用一些内存,但通常不会造成问题。 进程表中的条目很小,但是在发布之前,进程ID无法重用。 在64位操作系统上,这不太可能引起任何问题,因为PCB比工艺表条目大得多。
可以想象,大量的僵尸可能会影响可供其他进程使用的内存量。 但是,如果您有那么多僵尸,那么父应用程序或操作系统错误就是一个严重的问题。
如何删除僵尸进程您无法*死僵尸进程,因为它已经死了。 它不会对任何信号做出响应,因为它已从内存中删除了-无处发送SIGKILL信号。
您可以尝试将 发送SIGCHLD信号 给父进程,但是如果子进程终止时它不起作用,那么现在也不大可能起作用。
唯一可靠的解决方案是*死父进程。 终止时,其子进程将被该 继承init进程 ,这是在Linux系统中运行的第一个进程(其进程ID为1)。
该init进程定期执行必要的清理僵尸的操作,因此要*死它们,您只需*死创建它们的进程即可。 该top命令是查看是否有僵尸的便捷方法。
输入以下内容:
该系统具有八个僵尸进程。 我们可以 列出来列出它们 通过使用 通过ps命令并将其 管道 egrep。 同样,僵尸进程的状态标志为“ Z”,您通常还会看到“已失效”。
输入以下内容:
ps aux | egrep“ Z |已终止”
列出了僵尸进程。
与来回滚动浏览相比,这是发现僵尸进程ID的一种更巧妙的方法top。 我们还看到一个名为“ badprg”的应用程序产生了这些僵尸。
第一个僵尸的进程ID是7641,但是我们需要找到其父进程的进程ID。 我们可以 使用ps再次 。 我们将使用输出选项(-o)告知ps仅显示父级的进程ID,然后将其与 一起传递ppid=标志 。
我们要查找的进程将使用 指示-p(process)选项 ,然后传入僵尸的进程ID。
因此,我们键入以下命令以查找进程7641的进程信息,但它将仅报告父进程的ID:
ps -o ppid = -p 7641
我们被告知父进程ID为7636。我们现在可以 使用它来交叉引用它ps再次 。
我们看到这与之前的父进程的名称匹配。 要终止父进程,请在kill命令中使用SIGKILL选项,如下所示:
*死-SIGKILL 7636
根据父流程的所有者,您可能还需要使用sudo。
僵尸并不可怕……
…除非他们陷入大群。 没什么可担心的,只需重新启动即可清除它们。
但是,如果您发现某个应用程序或进程始终在生成僵尸,则应注意这一点。 它很可能只是一个草率的程序,在这种情况下,也许有一个更新的版本可以在子进程之后正确进行清理。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved