On Unix and Unix-like computer operating systems, a zombie process or defunct
process is a process that has completed execution but still has an entry in the
process table, this entry being still needed to allow the process that started
the zombie process to read its exit status. The term zombie process derives from
the common definition of zombie—an undead person. In the term's colorful
metaphor, the child process has died but has not yet been reaped.
When a process ends, all of the memory and resources associated with it are
deallocated so they can be used by other processes. However, the process's entry
in the process table remains. The parent can read the child's exit status by
executing the wait system call, at which stage the zombie is removed. The wait
call may be executed in sequential code, but it is commonly executed in a
handler for the SIGCHLD signal, which the parent is sent whenever a child has
died.
After the zombie is removed, its process ID and entry in the process table can
then be reused. However, if a parent fails to call wait, the zombie will be left
in the process table. In some situations this may be desirable, for example if
the parent creates another child process it ensures that it will not be
allocated the same process ID. As a special case, under Linux, if the parent
explicitly ignores the SIGCHLD (sets the handler to SIG_IGN, rather than simply
ignoring the signal by default), all child exit status information will be
discarded and no zombie processes will be left.
A zombie process is not the same as an orphan process. An orphan process is a
process that is still executing, but whose parent has died. They don't become
zombie processes; instead, they are adopted by init (process ID 1), which waits
on its children.
Zombies can be identified in the output from the Unix ps command by the
presence of a "Z" in the STAT column. Zombies that exist for more than a short
period of time typically indicate a bug in the parent program. As with other
leaks, the presence of a few zombies isn't worrisome in itself, but may indicate
a problem that would grow serious under heavier loads. Since there is no memory
allocated to zombie processes except for the process table entry itself, the
primary concern with many zombies is not running out of memory, but rather
running out of process ID numbers.
To remove zombies from a system, the SIGCHLD signal can be sent to the parent
manually, using the kill command. If the parent process still refuses to reap
the zombie, the next step would be to remove the parent process. When a process
loses its parent, init becomes its new parent. Init periodically executes the
wait system call to reap any zombies with init as parent.