在 Ubuntu(以及其他 Linux 发行版)中,**僵尸进程(Zombie / Defunct Process)**是指已经结束运行、但其父进程还没有调用 wait() 系列函数来回收其退出状态的进程。
下面按「识别 → 排查 → 处理 → 预防」的顺序说明。
ps 查看ps aux | grep Z
或
ps -ef | grep defunct
典型特征:
Z<defunct>示例:
user 12345 12340 0 10:00 ? 00:00:00 [myapp] <defunct>
说明:
12345 是僵尸进程 PID12340 是其父进程 PID(PPID)top
在顶部可以看到:
Tasks: 210 total, 1 zombie
僵尸进程不能直接 kill,必须处理其父进程。
ps -o pid,ppid,stat,cmd -p <僵尸PID>
或:
pstree -p | grep <僵尸PID>
找到 PPID 后:
ps -p <PPID> -o pid,cmd,stat
如果是你自己写的程序:
wait() / waitpid()signal(SIGCHLD, SIG_IGN)如果是服务程序:
# 重启父进程(服务)
systemctl restart <service>
⚠️ 会影响该父进程管理的所有子进程
kill -TERM <PPID>
# 或
kill -9 <PPID>
父进程死后,僵尸进程会被 init(PID 1)接管并自动回收。
kill -9 <僵尸PID> # 无效
僵尸进程已经“死”了,无法再被杀。
init(PID 1)正常情况下 init 会自动回收,若出现僵尸:
dumb-init / tiniENTRYPOINT ["tini", "--", "your-app"]
wait()# 查看僵尸
ps aux | awk '$8 ~ /Z/'
# 查看僵尸及其父进程
ps -eo pid,ppid,stat,cmd | awk '$3 == "Z"'
# 统计僵尸数量
ps aux | awk '$8 ~ /Z/' | wc -l
如果你愿意,可以把 ps aux | grep Z 或 pstree 的输出贴出来,我可以帮你具体分析是哪一个程序导致的。