什么是 <defunct> 进程,为什么它不会被杀死?

Edu*_*scu 266 process kill zombie

chrome 浏览器没有响应,我试图杀死它,但该进程<defunct>并没有消失,并且没有被杀死:

在此处输入图片说明

什么是<defunct>进程,为什么它不会被杀死?

Pad*_*ton 248

从您的输出中我们看到一个“defunct”,这意味着该进程已完成其任务或已损坏或终止,但其子进程仍在运行或这些父进程正在监视其子进程。要终止这种进程,kill -9 PID 不起作用。您可以尝试使用此命令杀死它们,但它会一次又一次地显示此信息。

确定哪个是这个失效进程的父进程并杀死它。要知道这一点,请运行以下命令:

$ ps -ef | grep defunct
    UID          PID     PPID       C    STIME      TTY          TIME              CMD
    1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
    1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>
Run Code Online (Sandbox Code Playgroud)

然后kill -9 637 27872,再验证这个失效的进程已经过去了ps -ef | grep defunct

  • 如果 ppid 为 `1`(`init`)怎么办?假设我只需要等待? (85认同)
  • 你不能杀死“不复存在”的进程。您只能通过杀死其父项来加速删除其在进程表中的条目。 (17认同)
  • 要自动终止,您也可以这样做(可能需要更改从输出中删除的字节):`ps -ef | grep 不复存在 | grep -v grep | 切-b8-20 | xargs kill -9` (10认同)
  • @warren 您无法杀死已失效的进程-即使使用 SIGKILL。此外,您正在不加选择地使用 kill -9 。请参阅 http://stackoverflow.com/questions/690415/in-what-order-should-i-send-signals-to-gracefully-shutdown-processes/690631#690631。如果你想杀死死去的孩子,你可以尝试:`parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs 杀死`。大约 30 秒后重新运行脚本,如果您愿意,可以使用 `kill -9`。(请注意,我特别不允许杀死 `Init`) (7认同)
  • @warren 谢谢。您还可以通过不执行第二个 grep 来使它稍微更短和 (imo) 更简单。只需将第一个 grep 更改为 `grep [d]efunct` 或类似的,它不会匹配自己。 (5认同)

jfs*_*jfs 77

手册页 ps(1) 说

标记<defunct>的进程是死进程(所谓的“僵尸”),因为它们的父进程没有正确销毁它们而保留下来。init(8)如果父进程退出,这些进程将被销毁。

你不能杀死它,因为它已经死了。唯一剩下的是进程表中的一个条目

在 Unix 和类 Unix 计算机操作系统上,僵尸进程或失效进程是已完成执行但在进程表中仍有条目的进程。仍需要此条目以允许父进程读取其子进程的退出状态。

除非有很多这样的过程,否则让这些过程存在并没有什么坏处。Zombie 最终会被其父级(通过调用wait(2))收割。如果原来的父init进程在它自己退出之前没有收获它,那么进程 ( pid == 1) 会在稍后的时间完成它。僵尸进程只是:

一个已经终止的进程,当它的退出状态被报告给另一个正在等待该进程终止的进程时被删除。

  • “除非有很多这样的过程,否则让这些过程存在并没有什么坏处”。这不是真的。这些失效的进程仍然可以保持文件句柄打开(例如锁定文件)和端口打开。据我所知,有时没有系统重启就无法保存这些进程。 (3认同)
  • @Scott:为什么你认为死进程会保持文件句柄打开?您是否有一个指向文档的链接,一个可以演示这种行为的脚本? (2认同)
  • @Scott:看起来您提到的问题与僵尸进程无关,因为我会惊讶于死进程可能会保持文件句柄打开。让我们避免未经证实的误导性声明 (2认同)

Kev*_*vin 9

扩展帕丁顿的答案..

从您的输出中,我们看到一个defunct,这意味着该进程已完成其任务或已损坏或终止。它的父进程仍在运行并且没有注意到它的死子进程。

kill -9 PID 不会工作(已经死了)。

要确定此子进程的父进程,请运行以下命令:

ps -ef | grep defunct

 UID  PID **PPID** C STIME TTY TIME     CMD
 1000 637  27872   0 Oct12 ?   00:00:04 [chrome] <defunct>
Run Code Online (Sandbox Code Playgroud)

看看谁是父母: ps ax | grep 27872

如果你愿意,你可以杀死父对象,死者就会消失。 kill -9 27872

有关更多技术推理,请参阅 Jfs 答案。


小智 5

我不小心创建<defunct>了进程

  • 从终端启动它们并
  • 然后不小心将它们放入后台(Ctrl+Z)并
  • 以某种方式终止程序。

解决方案是在每个打开的终端窗口中尝试该命令fg。然后失效的进程就会消失。