僵尸进程 超通俗说法(Linux 通用,Ubuntu 也一样),在 Ubuntu 26.04 里,僵尸进程(Zombie)的特征是:STAT 列为 Z、命令行带 <defunct>、不占 CPU / 内存,但占进程表项。下面给出最直接、可复制的排查方法。
1. 什么是僵尸进程(Zombie Process)?
简单说:
进程已经死了,但尸体还在进程表里没被收走,就叫僵尸进程。
- 它不占内存
- 不占 CPU
- 不会搞崩系统
- 但会占一个进程号(PID)
状态标识:Z(zombie),日志里会看到 <defunct>。
2. 它是怎么产生的?
Linux 进程的死亡流程:
- 子进程运行结束 → 内核给它标为 死亡
- 子进程会留一个 退出状态码(告诉父进程 “我死了,结果是啥”)
- 父进程应该调用
wait()/waitpid()把状态收走,清理尸体 - 如果父进程没去收 → 子进程就变成 僵尸
一句话:
子进程死了,爹没管,就变僵尸。
3. 僵尸进程长什么样?
用 ps 看:
Z 1234 5678 [nginx] <defunct>
Z:僵尸状态1234:父进程 PID(爹)5678:僵尸 PID(尸体)<defunct>:已失效,就是僵尸
4. 僵尸进程危险吗?
少量完全无害。
危害只有一种:
僵尸太多,把 PID 号用光了 → 新程序无法启动。
普通服务器几万个 PID,一般很难用光。
只有写得很差的程序、死循环疯狂创建子进程又不回收,才会出问题。
5. 能不能直接 kill 僵尸?
不能!
僵尸已经是死进程了,你再 kill -9 也没用。
它在等爹来收尸,不是等你杀。
6. 正确处理方法(两种)
方法 1:通知父进程去收尸
kill -CHLD 父进程PID
给父进程发信号,提醒它 “你儿子死了,快来收”。
方法 2:杀掉父进程
父进程一死,僵尸会被 init/systemd(PID 1) 收养,系统会自动清理。
kill 父进程PID
# 不行再用
kill -9 父进程PID
7. 孤儿进程 vs 僵尸进程(别搞混)
- 孤儿进程:爹先死了,儿子还在跑 → 被 systemd 收养,正常运行,不是僵尸
- 僵尸进程:儿子死了,爹不管 → 尸体留在进程表
8. 一条命令查看所有僵尸
ps -A -o stat,ppid,pid,cmd | grep '^Z'
极简总结
出现一两个不用管,大量出现说明程序写得有 bug
僵尸 = 死了没被收尸的进程
不占资源,少量无害
不能 kill 僵尸,只能杀父进程或通知父进程回收