僵尸进程是什么
子进程退出后,父进程需要用 wait 系列调用回收它的退出状态。如果父进程没有回收,子进程的进程描述符就会一直保留,状态显示为 Z(defunct),也就是僵尸进程。它几乎不占内存也不占 CPU,但会占用 PID 与进程表条目;数量持续增长时,说明父进程存在缺陷。
基本信息
| 状态标识 | ps 输出 STAT 列的 Z(defunct) |
|---|---|
| 资源占用 | 不占内存与 CPU,占用 PID 与进程表项 |
| 处理对象 | 持有僵尸的父进程,而不是僵尸本身 |
| 信号特性 | 僵尸进程已终止,kill 对它无效 |
| 根因归属 | 应用缺陷,需要修复父进程的回收逻辑 |
典型使用场景
- 监控告警提示僵尸进程数量持续增加
- 排查「进程数达到上限」导致的创建失败
- 巡检时发现某个应用长期持有大量僵尸进程
- 确认僵尸是否在服务重启后被清理
- 作为应用缺陷证据提交研发修复
定位与处理
定位与处理
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/' | head # 列出僵尸进程及其父进程
ps -eo stat | grep -c Z # 统计僵尸数量
ps -o pid,ppid,stat,cmd -p <ZOMBIE_PID> # 查看指定僵尸与它的父进程
ps -o pid,ppid,stat,cmd -p <PPID> # 查看父进程当前状态
pstree -p <PPID> | head # 查看父进程下挂的子进程
systemctl restart app-web # 重启父进程服务(临时缓解)
# 长期方案:修复父进程的 wait 回收逻辑,由研发处理现象与判读
| 现象 | 含义 | 处理方向 |
|---|---|---|
| 少量瞬时僵尸 | 正常回收过程中的短暂状态 | 无需处理 |
| 数量持续增长 | 父进程未回收子进程 | 交研发修复 |
| 重启后消失 | 重启触发回收 | 临时缓解,根因未解决 |
| PID 资源告警 | 进程表项被占满 | 先重启缓解再定位父进程 |
僵尸进程杀不掉:信号对它无效。要做的是让父进程回收,或者重启父进程——父进程退出后,僵尸会被 init/systemd 接管并回收。
僵尸数量长期增长会耗尽 PID 资源,导致新进程无法创建:这属于需要跟踪的应用缺陷,不能只靠定期重启掩盖。