在Shell脚本中监控僵尸进程数量,可以通过多种方式实现,以下是几种常用的方法:

使用ps命令统计僵尸进程
#!/bin/bash
# 统计僵尸进程数量
zombie_count=$(ps aux | awk '{if ($8 == "Z") print $0}' | wc -l)
# 或更简洁的方式
zombie_count=$(ps aux | grep -c "Z")
echo "当前僵尸进程数量: $zombie_count"
使用/proc文件系统
#!/bin/bash # 通过/proc文件系统统计僵尸进程 zombie_count=$(grep -c "state[[:space:]]*Z" /proc/*/status 2>/dev/null) echo "当前僵尸进程数量: $zombie_count"
完整的监控脚本(带告警功能)
#!/bin/bash
# 配置参数
ZOMBIE_THRESHOLD=5 # 告警阈值
LOG_FILE="/var/log/zombie_monitor.log"
# 获取僵尸进程数量
get_zombie_count() {
ps aux | awk '{if ($8 == "Z") print $0}' | wc -l
}
# 获取僵尸进程详细信息
get_zombie_detail() {
ps aux | awk '{if ($8 == "Z") print $0}'
}
# 发送告警(示例:输出到日志,实际可改为邮件、短信等)
send_alert() {
local count=$1
local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$timestamp] 警告:发现 $count 个僵尸进程!" >> "$LOG_FILE"
get_zombie_detail >> "$LOG_FILE"
}
# 主监控逻辑
main() {
local current_count=$(get_zombie_count)
echo "当前僵尸进程数量: $current_count"
# 检查是否超过阈值
if [ "$current_count" -gt "$ZOMBIE_THRESHOLD" ]; then
send_alert "$current_count"
echo "已发送告警,详情请查看日志: $LOG_FILE"
fi
}
# 执行主函数
main
定时监控脚本(配合crontab使用)
#!/bin/bash
# 监控脚本 - 每5分钟检查一次
INTERVAL=300 # 5分钟
while true; do
zombie_count=$(ps aux | awk '{if ($8 == "Z") print $0}' | wc -l)
current_time=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$current_time] 僵尸进程数: $zombie_count"
# 可以添加条件判断,例如超过阈值时报警
if [ "$zombie_count" -gt 10 ]; then
echo "警告:僵尸进程数量异常!" > /dev/stderr
# 这里可以添加发送邮件、写入系统日志等操作
fi
sleep $INTERVAL
done
使用top命令(另一种方式)
#!/bin/bash
# 使用top命令监控僵尸进程
zombie_count=$(top -bn1 | grep "Zombie" | awk '{print $NF}')
if [ -z "$zombie_count" ]; then
zombie_count=0
fi
echo "当前僵尸进程数量: $zombie_count"
使用方法
-
直接运行:
chmod +x zombie_monitor.sh ./zombie_monitor.sh
-
配合crontab实现定期监控:
# 编辑crontab crontab -e
添加以下行(每5分钟执行一次)
/5 * /path/to/zombie_monitor.sh
3. **作为系统服务**:
可以创建一个systemd服务文件来实现持续监控。
## 注意事项
- 僵尸进程通常无法被`kill`命令杀死,需要处理其父进程
- 大量僵尸进程可能表示系统存在问题
- 建议将监控集成到现有的系统监控方案中
- 日志轮转是必要的,防止日志文件过大
选择合适的监控方式取决于你的具体需求:是临时检查还是持续监控,是否需要告警功能等。