Linux 僵尸进程(Zombie Process)排查与处理笔记
当子进程退出(exit)后,父进程尚未调用wait()waitpid()回收其退出状态,系统会将该进程标记为僵尸进程,显示状态为Z或defunct。Zombie 不消耗 CPU 或内存,但占用进程号。如果数量过多,会影响系统运行。Zombie 不能直接 kill,因为它已经 “死了”。应通过找父进程 → 发送信号 → 必要时重启父进程的方式处理。少量 Zombie 无害,大量 Zombie 会导致
目录标题
Linux 僵尸进程(Zombie Process)排查与处理笔记
1. 背景说明
在 节点上通过 top 发现系统存在 Zombie 进程(Z 状态)。Zombie 进程无法被直接杀死,需要通过排查父进程并让其回收子进程资源来解决。
2. 什么是 Zombie(僵尸进程)
当子进程退出(exit)后,父进程尚未调用 wait()/waitpid() 回收其退出状态,系统会将该进程标记为僵尸进程,显示状态为 Z 或 defunct。
Zombie 不消耗 CPU 或内存,但占用进程号。如果数量过多,会影响系统运行。
3. 常见进程状态简表
| 状态 | 含义 |
|---|---|
| R | 运行(runnable) |
| S | 可中断睡眠(sleeping) |
| D | 不可中断睡眠(通常为 IO) |
| T | 停止(traced or stopped) |
| Z | 僵尸(zombie / defunct) |
4. Zombie 进程的查看方法
方法一:使用 top
top | head -n 2
在 top 输出的第一行可看到 Zombie 进程数量,例如:
Tasks: 234 total, 1 running, 233 sleeping, 0 stopped, 2 zombie
方法二:通过 defunct 字段统计
ps -ef | grep defunct | grep -v grep | wc -l
显示当前 defunct 记录数量(仅作数量参考)。
方法三:查看详细进程状态(推荐)
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
输出示例:
Z 1234 5678 [nginx] <defunct>
字段含义:
- stat:进程状态(Z 为僵尸)
- ppid:父进程 PID
- pid:僵尸进程 PID(不可杀)
- cmd:命令名称(通常显示为
<defunct>)
5. Zombie 进程处理方法
✦ 关键点:Zombie 不能被直接 kill
Zombie 已经退出,进程本体不存在,无法对其 PID 进行 kill。
必须处理其父进程(PPID),让父进程执行 wait() 清理僵尸。
5.1 找到 Zombie 的父进程 PPID
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
示例输出:
Z 4567 7890 [worker] <defunct>
这里:
- PPID = 4567 → 这个父进程需要处理
- PID = 7890 → 僵尸进程,没必要 kill
5.2 通知父进程回收 Zombie(常用)
向父进程发送 SIGCHLD 信号,让其调用 wait():
kill -18 <PPID>
比如:
kill -18 4567
自动化处理(非必要):
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print "kill -18 " $2}'
5.3 如果父进程无响应(程序 bug 或卡住)
若父进程无法正确处理 SIGCHLD,Zombie 会持续存在。
解决方式:
方法一:重启父进程(推荐)
kill <PPID>
systemctl restart xxx.service
方法二:父进程退出后,init(1) 会自动接管并清理
如果父进程被 kill,Zombie 将被 systemd 接管并最终回收。
5.4 如果 Zombie 来自核心服务
例如 kubelet、docker、数据库等,建议:
- 查看父进程日志确认原因(例如死锁、io hang)
- 无法解决时,平滑重启对应服务(避免影响集群)
6. 常见 Zombie 产生原因
- 父进程没有正确调用 wait()(程序 bug)
- 父进程阻塞(D 状态磁盘 IO 阻塞)
- 父进程锁死或卡住(无响应)
- 应用程序退出流程不完整
7. 排查建议
-
重点关注父进程是否异常
ps -p <PPID> -o pid,stat,cmd -
如果父进程处于 D 状态(不可中断 IO),需要重点排查存储层问题。
-
若 Zombie 数量持续增长,说明应用需要修复(可能是 wait() 漏掉了)。
8. 总结
- Zombie 不能直接 kill,因为它已经 “死了”。
- 应通过 找父进程 → 发送信号 → 必要时重启父进程 的方式处理。
- 少量 Zombie 无害,大量 Zombie 会导致 PID 耗尽。
更多推荐



所有评论(0)