我有一个由其父进程监控的进程。 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 收割它所需的一切。 exit
的 WCHAN
字段,我认为是一个有值(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/