The chrome browser was not responsive and I tried to kill it, but instead of disappearing the process had <defunct>
at its right, and didn't get killed:
What is <defunct>
for a process and why it doesn't it get killed?
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.
Sign up to join this communityFrom your output we see a "defunct", which means the process has either completed its task or has been corrupted or killed, but its child processes are still running or these parent process is monitoring its child process. To kill this kind of process, kill -9 PID doesn't work. You can try to kill them with this command but it will show this again and again.
Determine which is the parent process of this defunct process and kill it. To know this run the command:
$ ps -ef | grep defunct
UID PID PPID C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
1000 1808 1777 0 Oct04 ? 00:00:00 [zeitgeist-datah] <defunct>
Then kill -9 637 27872
, then verify the defunct process is gone by ps -ef | grep defunct
.
ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
grep [d]efunct
or similar and it won't match itself.
parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill
. Rerun the script after 30 seconds or so, with the kill -9
if you desire. (Note that I specifically disallow killing of Init
)
Processes marked
<defunct>
are dead processes (so-called "zombies") that remain because their parent has not destroyed them properly. These processes will be destroyed byinit(8)
if the parent process exits.
You can't kill it because it is already dead. The only thing left is an entry in the process table:
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 is still needed to allow the parent process to read its child's exit status.
There is no harm in letting such processes be unless there are many of them. Zombie is eventually reaped by its parent (by calling wait(2)
). If original parent hasn't reaped it before its own exit then init
process (pid == 1
) does it at some later time. Zombie Process is just:
A process that has terminated and that is deleted when its exit status has been reported to another process which is waiting for that process to terminate.
expanding on Paddington's answer..
From your output we see a defunct, which means this child process has either completed its task or has been corrupted or killed. Its parent process is still running and has not noticed its dead child.
kill -9 PID
won't work (already dead).
To determine the parent of this child process, run this command:
ps -ef | grep defunct
UID PID **PPID** C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
See who the parent is: ps ax | grep 27872
If you want you can kill the parent, and the defunct will go away.
kill -9 27872
see Jfs answer for a more technical reasoning.
I accidently create <defunct>
processes by
Solution is to try the command fg
in every open terminal window.
Then the defunct processes disappear.
bg
works just as well - anything that unfreezes the process from the shell which still holds the handle to it.
Oct 12, 2021 at 15:48
Adding to @Paddington's answer, I added this function to my bashrc for quick checking:
defunct(){
echo "Children:"
ps -ef | head -n1
ps -ef | grep defunct
echo "------------------------------"
echo "Parents:"
ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
echo "$ppids" | while read ppid; do
ps -A | grep "$ppid"
done
}
It outputs something like:
Children: UID PID PPID C STIME TTY TIME CMD user 25707 25697 0 Feb26 pts/0 00:00:00 [sh] user 30381 29915 0 11:46 pts/7 00:00:00 grep defunct ------------------------------ Parents: 25697 pts/0 00:00:00 npm
Thank you Mike S. We took your line and wrote a script that will kill defunct processes whose parent is in.telnetd. We didn't want it to kill any parent process, just telnetd that we know is causing a problem and we'll run it multiple times to kill multiple ones if needed.
# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.
first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"
# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi
kill -9 PID
don't work". It's partially true: in reality, NO kill will work. Besides, -9 should be used as a last resort. 99% of the time a default kill of the parent process will kill it AND reap all the children. A "default kill" is a SIGTERM (-15). I encourage fans of the -9 (SIGKILL) to read stackoverflow.com/questions/690415/…<zombie>
instead of<defunct>
would explain itself why kill is not an option. You cannot kill a zombie.