3

我有一个由其父级监控的进程。孩子遇到了导致它调用的错误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。孩子似乎没有倾倒核心或做任何事情。我已经离开系统几分钟,没有任何改变。

有谁知道可能是什么原因造成的,或者我能做些什么?

更新:另一个有趣的信息——如果我kill -9是父进程,子进程就会消失。这有点莫名其妙,因为父进程是微不足道的,只是阻塞在waitpid. 此外,当这个问题发生时,我没有得到任何核心转储(来自孩子)。

更新:似乎孩子被困在了schedule,从exit_mm调用,从调用do_exit。我想知道为什么exit_mm会打电话schedule。我想知道为什么杀死父母会解开它。

4

1 回答 1

8

我终于想通了!这个过程实际上一直在做有用的工作。该进程保存了对慢速文件系统上的文件的最后引用。当进程终止时,对文件的最后引用是释放,强制操作系统回收空间。该文件非常大,以至于需要数万次 I/O 操作,耗时 10 分钟或更长时间。

于 2013-10-08T22:39:04.250 回答