在 Ubuntu(以及所有 Linux 系统)中,僵尸进程(Zombie Process) 是一个已经结束运行、但还没有被父进程回收的进程。
僵尸进程是:
它不会真正“运行”,但也不会立刻消失。
在 Linux 中,子进程退出后,父进程需要调用 wait() 或 waitpid() 来:
如果 父进程没有回收子进程,子进程就会变成僵尸进程。
子进程 exit()
↓
内核保存退出状态
↓
父进程未调用 wait()
↓
子进程变成僵尸进程(Z 状态)
在 ps 或 top 中,僵尸进程的状态是:
Z
例如:
ps aux | grep Z
或:
ps -eo pid,ppid,stat,cmd | grep Z
输出示例:
1234 1000 Z [bash] <defunct>
<defunct> 表示“已失效”。
✅ 不会占用 CPU
✅ 不会占用内存
❌ 会占用 PID
ps aux | awk '$8=="Z" { print }'
或:
top
在 Tasks 行中可以看到:
Tasks: 120 total, 1 running, 118 sleeping, 0 stopped, 1 zombie
⚠️ 不能直接 kill 僵尸进程
因为:
kill -9 没用找到僵尸进程的父进程:
ps -eo pid,ppid,stat,cmd | grep Z
然后:
SIGCHLDkill -SIGCHLD 父进程PID
如果父进程仍然不处理,只能:
kill 父进程PID
父进程死后:
init(或 systemd,PID 1)接管init 会自动回收wait() / waitpid()signal(SIGCHLD, SIG_IGN) 自动回收僵尸进程是“已经死掉但还没被收尸的进程”,问题通常出在父进程,而不是子进程本身。
如果你愿意,我可以:
init / systemd 如何回收僵尸进程