题目
设计一个进程资源监控脚本
信息
- 类型:问答
- 难度:⭐⭐
考点
进程监控,资源阈值判断,邮件告警,脚本健壮性
快速回答
实现一个监控指定进程CPU/内存使用率的Shell脚本,当超过阈值时发送告警邮件:
- 使用
ps或top获取进程资源数据 - 设置CPU和内存的双重阈值判断
- 通过
mail命令发送告警邮件 - 添加参数校验和错误处理机制
- 使用
crontab定时执行
问题场景
在生产环境中,关键进程的资源异常可能导致服务中断。本脚本需实时监控指定进程的CPU和内存使用率,在超过阈值时自动触发告警。
核心实现方案
#!/bin/bash
# 配置参数
PROCESS_NAME="nginx"
CPU_THRESHOLD=80 # CPU使用率阈值(%)
MEM_THRESHOLD=70 # 内存使用率阈值(%)
EMAIL="admin@example.com"
# 获取进程资源使用率
pid=$(pgrep -o $PROCESS_NAME)
if [ -z "$pid" ]; then
echo "错误: 进程 $PROCESS_NAME 未找到" | mail -s "进程监控告警" $EMAIL
exit 1
fi
# 使用ps获取CPU和内存数据
usage=$(ps -p $pid -o %cpu,%mem --no-headers)
cpu_usage=$(echo $usage | awk '{print $1}')
mem_usage=$(echo $usage | awk '{print $2}')
# 浮点数比较函数
compare_floats() {
awk -v n1="$1" -v n2="$2" 'BEGIN {if (n1+0 > n2+0) exit 0; exit 1}'
}
# 阈值判断与告警
if compare_floats $cpu_usage $CPU_THRESHOLD || compare_floats $mem_usage $MEM_THRESHOLD; then
echo "警告: 进程 $PROCESS_NAME (PID:$pid) 资源超标" > /tmp/alert.txt
echo "CPU使用率: ${cpu_usage}% (阈值: ${CPU_THRESHOLD}%)" >> /tmp/alert.txt
echo "内存使用率: ${mem_usage}% (阈值: ${MEM_THRESHOLD}%)" >> /tmp/alert.txt
mail -s "资源监控告警" $EMAIL < /tmp/alert.txt
fi关键考点解析
- 进程监控:使用
pgrep获取PID,ps -p精准定位进程资源数据 - 阈值判断:通过awk实现浮点数比较,支持小数阈值
- 邮件告警:使用系统
mail命令,邮件内容包含详细监控数据 - 健壮性设计:
- 进程不存在时的错误处理
- 使用临时文件避免邮件内容截断
- 返回码检查(示例中省略,实际需添加)
最佳实践
- 定时任务配置:通过
crontab -e添加定时执行(每5分钟):*/5 * * * * /path/to/monitor.sh - 参数化改造:可通过命令行参数传递进程名和阈值:
./monitor.sh -p java -c 90 -m 80 - 性能优化:避免频繁创建进程,使用
top -b -n1 -p $pid批量获取数据
常见错误
- ❌ 直接使用整数比较:
[ $cpu_usage -gt $CPU_THRESHOLD ](不支持小数) - ❌ 未处理多实例进程:当存在多个同名进程时需循环处理所有PID
- ❌ 邮件未配置:需提前安装
mailutils并配置SMTP - ❌ 权限问题:crontab执行环境缺少PATH变量,建议脚本中设置绝对路径
扩展知识
- 监控增强:添加连续超阈值检测(如连续3次超标才告警)
- 多通知渠道:集成企业微信/钉钉机器人API
- 资源类型扩展:监控线程数、文件描述符等指标
- 替代方案:专业监控工具(Prometheus+Grafana)更适合复杂场景