进程卡在退出,显示为僵尸,但不能收获

我有一个由其父母监控的进程。 孩子遇到一个错误,导致它叫abort 。 该进程不会篡改中止进程,所以它应该按预期进行(dump core,terminate)。 父母应该检测到孩子的终止,并触发一系列事件来应对失败。 孩子是multithreading和复杂的。

以下是我从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 。 我想知道为什么杀死父母会解决这个问题。

Solutions Collecting From Web of "进程卡在退出,显示为僵尸,但不能收获"

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