init永远不会收获僵尸/已经停止的进程

在内核2.6.18.8的Fedora Core 9networking服务器上,init不会收获僵尸进程。 如果最终没有为进程expression到无法分配新进程的上限,这将是可承受的。

ps -el | grep 'Z'示例输出 ps -el | grep 'Z'

 FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 Z 0 2648 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 1 Z 51 2656 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 1 Z 0 2670 1 0 75 0 - 0 exit ? 00:00:02 crond <defunct> 4 Z 0 2874 1 0 82 0 - 0 exit ? 00:00:00 mysqld_safe <defunct> 5 Z 0 28104 1 0 76 0 - 0 exit ? 00:00:00 httpd <defunct> 5 Z 0 28716 1 0 76 0 - 0 exit ? 00:00:06 lfd <defunct> 5 Z 74 10172 1 0 75 0 - 0 exit ? 00:00:00 sshd <defunct> 5 Z 0 11199 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11202 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11205 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11208 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11211 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11240 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11246 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11249 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 5 Z 0 11252 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 1 Z 0 14106 1 0 80 0 - 0 exit ? 00:00:00 anacron <defunct> 5 Z 0 14631 1 0 75 0 - 0 exit ? 00:00:00 sendmail <defunct> 

这是一个操作系统的错误? configuration错误? 我正在寻找这个问题的根源的灵感。 谢谢

如果父母死亡,一个过程将成为一个僵尸。 如果是这样,init将成为孤儿进程的新父项。

Init将定期执行wait(),并以init为父节点获取所有进程。 这是同步发生的,也就是说,它等待每个进程单独收获。 这可能会使stream程时间更长,如果一个stream程不能正确收获。

它可能暗示了系统中的一个错误,它可能不会。 我build议处理内核的内核邮件列表或dist特定的邮件列表。

当进程调用“退出”系统调用时,可能不完全完成。 例如,它可能有未决的IO操作正在进行中(例如,仍然在内核中部分caching的大写操作)。 发生这种情况时,内核必须在完成退出系统调用之前完成所有挂起的操作。

但是,一旦进程调用“退出”,它就不再存在,内核将尽可能多地回收它。 所以,尽pipe内核还没有完全准备好,但它会被报告为僵尸。

通常情况下,内核可以在几分之一秒内清理完成,退出系统调用完成,父进程得到通知,并获得进程。 但是,如果这个进程被永久性的IO进程挂起(比如nfs和时间限制authentication的各种组合),这可能会导致问题。 当发生这种情况时,恐怕你唯一的select就是重新启动。

僵尸不能被init收割。 这是通过调用wait *()来获取父进程的责任。 这些进程留下,以便父母可以采取返回值。