我有一个由其父级监控的进程。孩子遇到了一个错误,导致它调用abort
。该进程不会篡改中止进程,因此它应该按预期进行(转储核心、终止)。父级应该检测子级的终止并触发一系列事件来响应失败。子进程是多线程且复杂的。
这是我看到的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>
所以子进程(4930)已经终止。它是一只僵尸。正如预期的那样,我无法附加到它。然而,父级 (4929) 仍然被阻止:
int i;
// ...
waitpid (-1, &i, 0);
所以看起来这个孩子是一个僵尸,但不知何故还没有完成其父母收割它所需的一切。这WCHAN
现场exit
我认为这是一个有价值的线索。
平台为64位Linux,Ubuntu 13.04,内核3.8.0-30。孩子似乎没有倾倒核心或做任何事情。我已经离开系统几分钟了,没有任何变化。
有谁知道可能导致此问题的原因或我能做些什么?
Update:另一个有趣的信息——如果我kill -9
父进程,子进程消失。这有点令人困惑,因为父进程很简单,只是阻塞waitpid
。另外,当这个问题发生时,我没有得到任何核心转储(来自孩子)。
Update:看来孩子被困在schedule
,调用自exit_mm
,调用自do_exit
。我想知道为什么exit_mm
会打电话schedule
。我想知道为什么杀死父母会解除它。
我终于弄明白了!该进程实际上一直在做有用的工作。该进程保存了对a的最后一个引用large文件在一个slow文件系统。当进程终止时,对该文件的最后一个引用将被释放,迫使操作系统回收该空间。文件太大,需要数万次 I/O 操作,耗时 10 分钟或更长时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)