linux - 进程卡在退出,显示为僵尸但无法收割

标签 linux ubuntu exit

我有一个由其父进程监控的进程。 child 遇到错误,导致它调用 abort。该进程不会篡改中止进程,因此它应该按预期进行(转储核心,终止)。 parent 应该检测到 child 的终止并触发一系列事件来响应失败。 child 是多线程和复杂的。

这是我从 ps 中看到的:

F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  4929  1272  20   0  85440  6792 wait   S+   pts/2      0:00 rxd
1  1000  4930  4929  20   0      0     0 exit   Zl+  pts/2     38:21 [rxd] <defunct>

所以 child (4930) 已经终止。这是一个僵尸。正如预期的那样,我无法附加到它。但是,父级 (4929) 在以下位置处于阻塞状态:

int i;
// ...
waitpid (-1, &i, 0);

所以看起来 child 是僵尸,但不知何故还没有完成其 parent 收割它所需的一切。 exitWCHAN 字段,我认为是一个有值(value)的线索。

平台为64位Linux,Ubuntu 13.04,内核3.8.0-30。 child 似乎没有倾倒核心或做任何事情。我已离开系统几分钟,但没有任何变化。

有没有人知道可能导致此问题的原因或我能做些什么?

更新:另一个有趣的信息——如果我 kill -9 父进程,子进程就会消失。这有点令人费解,因为父进程很简单,只是阻塞在 waitpid 中。此外,发生此问题时,我没有得到任何核心转储(来自 child )。

更新: child 似乎卡在 schedule 中,从 exit_mm 调用,从 do_exit 调用。我想知道为什么 exit_mm 会调用 schedule。我想知道为什么杀死 parent 会解除它。

最佳答案

我终于明白了!这个过程实际上一直在做有用的工作。该进程保留了对 文件系统上的 文件的最后引用。当进程终止时,对文件的最后引用被释放,迫使操作系统回收空间。文件太大,需要数万次I/O操作,耗时10分钟以上。

关于linux - 进程卡在退出,显示为僵尸但无法收割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19059615/

相关文章:

Python CTRL-C 退出没有回溯?

java - 通过OpenStack安装的CentOS镜像的根密码是什么?

linux - echo 命令是否有可能破坏 so 文件?

java - 无法找到或加载 main (Ubuntu Java)

ubuntu - 我在 Digital Ocean 上有安全 apache 错误?

c - 如何避免 C 容器服务器的用户定义库程序中出现 "exit"?

c# - 托盘应用程序允许系统在注销或退出时终止我的程序

linux - Lighttpd - 从 Web 应用程序更新系统网络配置文件的最佳方法

linux - 条件中的 Bash 脚本通配符

objective-c - 如何将 Obj-C 2.0 与 GNUstep 一起使用?