[Processes in your ps output that are in the <exiting> or Z status are called zombies. -JP]
You cannot kill zombies; they are already dead.
"What is a zombie?" I hear you ask. "Why should a dead process stay around?"
Dead processes stick around for two principal reasons. The lesser of these is that they provide a sort of "context" for closing open file descriptors (38.3), and shutting down other resources (memory, swap space, and so forth). This generally happens immediately, and the process remains only for its major purpose: to hold on to its name and exit status (44.7).
A process is named by its process ID or PID. Each process also has associated with it a Parent Process ID. The parent PID is the PID of the process that created it via fork (38.2), or, if that particular process has since vanished, 1 (the PID of init (38.2)). While the original parent is around, it can remember the PIDs of its children. These PIDs cannot be re-used until the parent knows the children are done. The parent can also get a single byte of status (44.7) from each child. The wait system call looks for a zombie child, then "collects" it, making its PID available and returning that status. The init(8) program is always waiting, so that once a parent exits, init will collect all its children as they exit, and promptly ignore each status.
So, to get rid of a zombie, you must wait for it. If you have already done so or if the process' PPID is 1, the process is almost certainly stuck in a device driver (42.1) close routine, and if it remains that way forever, the driver has a bug.
- in comp.unix.questions on Usenet, 16 January 1989