Linux 进程卡在出口,显示为僵尸,但无法收割

Linux 进程卡在出口,显示为僵尸,但无法收割,linux,ubuntu,exit,Linux,Ubuntu,Exit,我有一个由父进程监视的进程。孩子遇到了一个错误,导致它调用中止。该进程不会干扰中止进程,因此应按预期进行(转储内核,终止)。父母应该检测孩子的终止,并触发一系列事件来响应失败。子线程是多线程的,并且非常复杂 以下是我从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/

我有一个由父进程监视的进程。孩子遇到了一个错误,导致它调用
中止
。该进程不会干扰中止进程,因此应按预期进行(转储内核,终止)。父母应该检测孩子的终止,并触发一系列事件来响应失败。子线程是多线程的,并且非常复杂

以下是我从
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>
因此,孩子似乎是一个僵尸,但不知何故还没有完成父母收获它所需的一切。我认为,
exit
WCHAN
字段是一条有价值的线索

该平台是64位Linux、Ubuntu 13.04、内核3.8.0-30。孩子似乎没有抛掷核心或做任何事情。我已经离开系统几分钟了,没有任何变化

有没有人知道是什么原因造成的,或者我能做些什么

更新:另一个有趣的信息——如果我
kill-9
父进程,子进程就会离开。这有点令人费解,因为父进程很简单,只是在
waitpid
中阻塞。此外,当这个问题发生时,我不会(从孩子那里)得到任何内核转储


更新:孩子似乎被困在
计划中,从
退出mm
调用,从
退出
调用。我想知道为什么
exit_-mm
会调用
schedule
。我想知道为什么杀死父母会让它不粘。

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

是什么给了您
ps-eo-wchan,pid | grep 4930
wchan
字段在上面。子项处于退出状态,父项处于等待状态。我相信孩子不知何故被困在内核的
exit
函数中,无法完成完全终止的过程。哦,是的,我现在明白了。在子进程中是否使用信号处理程序?它是否会在退出时挂起阻止IO?很高兴看到孩子的代码,但你告诉我它太复杂了。。没有机会把它分解成更简单的代码?@hek2mgl我不能在简单的条件下复制它。我认为它可能挂在I/O上,但在映射消失后,内核在退出时会做什么?我们确实使用信号处理程序,但是调用了
std::_exit
,内核已经接管了终止进程(因为进程是一个僵尸,我们知道它没有运行任何用户空间代码)。您可以用其他内核复制它吗?(其他发行版,自编等)?
int i;
// ...
waitpid (-1, &i, 0);