49 lines
2.3 KiB
Text
49 lines
2.3 KiB
Text
|
--------------------------------------------------------------------------------
|
||
|
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
|
||
|
|
||
|
cinit in general will keep the behaviour of reaping the vestiges,
|
||
|
which broken software left behind (as it is cleaner for the system to
|
||
|
deallocate unused ressources).
|