僵尸进程是已终止但父进程未回收其状态的进程,持续占用PID资源;Zabbix可通过ps -eo stat | grep -c 'Z'等命令监控并告警,需结合父进程排查根因。

僵尸进程(Zombie Process)是已终止但其父进程尚未调用 wait() 或 waitpid() 回收其退出状态的进程,它在进程表中仍保留一个条目,持续占用 PID 和少量内核资源。长期积累可能耗尽进程 ID 空间,影响系统稳定性。Zabbix 可通过自定义监控项+触发器实现对僵尸进程数量的实时采集与告警。
获取僵尸进程数量的可靠方式
Linux 中可通过 ps 或 top 查看,但 Zabbix 推荐使用轻量、无依赖、输出稳定的命令:
-
ps -eo stat | grep -c 'Z'—— 统计所有进程状态字段含 Z(zombie)的行数,最直接有效 -
ps aux | awk '$8 ~ /^Z$/ {count++} END {print count+0}'—— 更精确匹配第 8 列(STAT)为纯 Z,避免误匹配Z 或 <code>ZN - 避免使用
cat /proc/sys/kernel/pid_max或ps -ef | grep defunct,前者不反映实际僵尸数,后者易受干扰且性能较差
在 Zabbix Agent 端配置自定义监控项
编辑 /etc/zabbix/zabbix_agentd.d/userparameter_process.conf,添加:
UserParameter=proc.zombie.count,ps -eo stat | grep -c 'Z'
重启 agent 后,可在服务端执行 zabbix_get -s [host_ip] -k proc.zombie.count 验证返回整数值(如 0 或 3)。
注意:确保 Zabbix Agent 运行用户(通常是 zabbix)有权限执行 ps;若受限于容器或最小化系统,可改用 cat /proc/[0-9]*/stat 2>/dev/null | awk '$3=="Z"{c++} END{print c+0}' 作为备选。
创建监控项、触发器与告警动作
在 Zabbix Web 界面中操作:
- 为对应主机添加监控项:名称:“Zombie process count”,键值:“proc.zombie.count”,类型为“Zabbix agent”,更新间隔建议 30s(高频检测需平衡负载)
- 新建触发器:名称:“High zombie process count”,表达式设为
{HOSTNAME:proc.zombie.count.last()}>0(发现即告警),或更严格地{HOSTNAME:proc.zombie.count.avg(5m)}>2(5 分钟均值超 2 个) - 关联告警媒介(邮件/钉钉/企业微信等),并设置恢复通知,避免“告警风暴”后无人知晓已恢复
辅助排查与根因定位建议
告警发生后,不应只清理僵尸进程(kill 父进程或重启服务治标不治本),而应快速定位源头:
- 登录目标主机,运行
ps auxo pid,ppid,stat,comm,args | awk '$3~/^Z/ {print $1,$2,$4,$5}'获取僵尸进程 PID、父 PID、命令名及参数 - 用
ps -p [PPID] -o pid,ppid,comm,etime查看父进程是否异常(如长时间运行未响应、CPU 占用低但不回收子进程) - 检查应用日志(尤其是父进程日志),常见原因包括:C 程序未正确处理 SIGCHLD、Python 子进程未调用
wait()、Java 应用 fork 后未 waitFor()、或父进程已崩溃但子进程残留

















