怎样从系统监控中发现centos僵尸进程
小樊
33
2025-11-14 04:02:51
从系统监控中发现 CentOS 僵尸进程
一、快速识别要点
- 僵尸进程在进程状态中显示为Z(或命令行中带有defunct标记),它不再占用 CPU/内存,但会占用进程号与进程表项。在监控中,优先关注状态列与命令行是否出现上述特征。
二、命令行即时排查
- 使用 ps 精准筛选状态为 Z 的进程,并显示父进程便于溯源:
- ps -A -o stat,ppid,pid,cmd | awk ‘$1 ~ /^[Zz]/ {print}’
- 用 top 查看整体负载与僵尸数量:
- top/htop 中观察进程列表的STAT列,状态为Z的即为僵尸;top 头部会显示zombie计数。
- 借助 /proc 文件系统核对单个进程状态:
- cat /proc//status | grep State;若包含Z,即为僵尸。
- 以进程树视角定位父子关系与源头:
- pstree -p | grep -E ‘Z|\[zombie\]’;或 pstree -aps <父PID> 查看可疑父进程的子进程情况。
三、持续监控与告警
- 轻量循环脚本定期巡检并输出时间戳,便于接入日志或告警系统:
- #!/usr/bin/env bash
while true; do
ts=$(date ‘+%F %T’)
z=$(ps -A -o stat,ppid,pid,cmd | awk ‘$1 ~ /^[Zz]/ {print $0}’)
if [[ -n “$z” ]]; then
echo “[$ts] Zombie(s) found:”; echo “$z”
fi
sleep 10
done
- 使用系统监控平台设置阈值告警(示例思路):
- Monit:配置进程监控并在检测到异常状态时触发告警(需结合自定义脚本或外部检查)。
- Nagios:使用 check_procs 插件对状态为 Z 的进程设置阈值告警,例如:
- command_line /usr/lib64/nagios/plugins/check_procs -Z -c 0
- 含义:当Z 状态进程数 > 0时触发告警。
四、排查与处置要点
- 处置原则:僵尸进程不能被 kill -9 直接清除,应定位并终止其父进程(使僵尸被 init/systemd 收养并回收),或修复父进程未调用 wait/waitpid 回收子进程的逻辑缺陷。
- 操作建议:
- 先通过 pstree/ps 找到僵尸的PPID,确认父进程是否为关键服务;必要时先尝试**kill -HUP 促其回收,失败再评估kill -9 **的影响范围并择机重启父进程。
- 若父进程异常或无回收逻辑,需从应用侧修复(正确处理 SIGCHLD、回收子进程),并滚动重启相关服务以彻底清除积累僵尸。