-------------------------------------------------------------------------------- Removing Zombies, Nico Schottelius 2005-06-15 (Last Modified: 2005-06-15) -------------------------------------------------------------------------------- First of all, the definition of a zombie: ''Defunct ("zombie") process, terminated but not reaped by its parent.'' [Excerpt from ps(1)] ''In the case of a terminated child, performing a wait allows the system to release the resources associated with the child; if a wait is not performed, then terminated the child remains in a "zombie" state (see NOTES below). [...] NOTES A child that terminates, but has not been waited for becomes a "zom- bie". The kernel maintains a minimal set of information about the zombie process (PID, termination status, resource usage information) in order to allow the parent to later perform a wait to obtain information about the child. As long as a zombie is not removed from the system via a wait, it will consume a slot in the kernel process table, and if this table fills, it will not be possible to create further processes. If a parent process terminates, then its "zombie" children (if any) are adopted by init(8), which automati- cally performs a wait to remove the zombies.'' [Excerpt from waitpid(2)] So you can see, that if some process misbehaves and forgets about its children, we, cinit, will adopt it. In the first versions of cinit (cinit-0.0.1 <-> cinit-0.0.7) we ignored SIGCHLD. This way the zombies stayed in the system. Since cinit-0.0.8 we have sig_chld(), which removes the zombies. So far so good. Now let's remove this feature. Yes, you heard right. If cinit does not catch the zombies they will stay in the system. Yes, that's ugly. And that's how it should be. You should see, which software is broken and should contact the authors to fix it. To restore the 'old' behaviour of cinit, change generic/set_signals.c (ignore SIGCHLD) Makefile: remove serv/sig_child.c from modules list Still cinit will currently keep the behaviour of reaping the vestiges broken software left behind (as it is cleaner for the system to deallocate unused ressources).