僵尸进程不耗资源但占PID,超阈值致系统“窒息”;应分三级告警:≥1个即日志通知,≥5个或5分钟增≥3个则邮件短信,≥10个持续10分钟可自动重启可控父服务;统计须用ps -A -ostat | grep -c '^Z'防误判,告警需含僵尸列表、父进程状态及新增趋势,并设静默窗口与恢复确认。

僵尸进程本身不消耗CPU或内存,但会持续占用PID和进程表项。一旦数量上升,系统可能因无法分配新PID而拒绝创建进程——表面正常,实则已濒临“窒息”。所以监控核心不是看它多“活跃”,而是数它多“扎堆”;通知机制的关键,在于用合理阈值触发及时干预。
阈值怎么设才合理
单个僵尸进程出现即需关注,因为它暴露了父进程回收逻辑缺陷;但真正影响系统的是累积效应。推荐分层设置:
- 一级预警:发现 ≥1 个僵尸进程,立即记录日志并触发轻量通知(如企业微信/钉钉机器人),用于快速定位根因
- 二级告警:5分钟内新增 ≥3 个,或当前总数 ≥5 个,触发邮件+短信双通道报警,提示需人工介入
- 三级阻断:连续10分钟总数 ≥10,可联动执行自动重启父服务(仅限已知可控服务,如 nginx、redis),避免手动响应延迟
怎么准确数出僵尸数量
别只依赖 ps aux | grep 'Z',它容易误匹配命令行含字母 z 的进程。更可靠的方式是直接读取进程状态字段:
-
ps -A -ostat,pid,ppid,cmd | grep -w 'Z'——-w确保只匹配完整单词 Z,排除干扰 -
ps -eo stat,pid,ppid,comm | awk '$1 ~ /^Z/ {print}'—— 用stat字段开头为 Z 判定,最精准 - 统计总数:
ps -A -ostat | grep -c '^Z',注意^Z表示行首的 Z,避免统计偏差
通知脚本要带上下文才管用
光说“有5个僵尸”没意义。一次有效的告警至少应包含三类信息:
- 当前僵尸列表:PID、父进程PPID、对应命令(
ps -eo pid,ppid,state,comm | awk '$3=="Z"') - 父进程状态快照:比如
ps -p [PPID] -o pid,ppid,state,comm,etime,看父进程是否僵死或长时间运行 - 最近1分钟新增趋势:对比上一轮检查结果,判断是突发还是持续增长
把这些拼成一段结构化文本,再通过 mail -s 或调用 Webhook 发送,运维人员打开就能动手,不用再查一遍。
别让通知变成噪音
高频轮询+无抑制机制,很容易导致告警轰炸。建议加两道过滤:
- 静默窗口:同一父进程引发的僵尸,10分钟内重复告警只发一次
- 恢复确认:当僵尸数回落到0并维持2分钟,自动发送“已恢复”通知,闭环可追踪
- 分级路由:开发环境只推钉钉;生产环境必须邮件+短信+值班电话语音呼叫
不复杂但容易忽略。

















