This article is from a FAQ concerning SCO operating
systems. While some of the information may be applicable to any OS,
or any Unix or Linux OS, it may be specific to SCO Xenix, Open
There is lots of Linux, Mac OS X and general Unix info elsewhere on
this site: Search this site is the best
way to find anything.
One of the early things people learn about Unix is that a "kill
-9" is invincible- that a process must die if you send it a KILL
(-9). However, that's not entirely true:
A process can be sleeping in kernel code. Usually that's
because of faulty hardware or a badly written driver- or maybe a
little of both. A device that isn't set to the interrupt the driver
thinks it is can cause this, for example- the driver is waiting for
something its never going to get. The process doesn't ignore your
signal- it just never gets it (but see Linux TASK_KILLABLE also).
A zombie process doesn't react to signals because it's not
really a process at all- it's just what's left over after it died.
What's supposed to happen is that its parent process was to issue a
"wait()" to collect the information about its exit. If the parent
doesn't (programming error or just bad programming), you get a
zombie. The zombie will go away if its parent dies- it will be
"adopted" by init which will do the wait()- so if you see one
hanging about, check its parent; if it is init, it will be gone
soon, if not the only recourse is to kill the parent..which you may
or may not want to do.
Finally, a process that is being traced (by a debugger, for
example) won't react to the KILL either.