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);