对于单台服务器或临时排查场景,直接用 Shell 脚本配合 crontab 定时任务是最快落地的方案,但如果是集群或长期监控,建议优先使用现成的监控系统。
先说结论:脚本监控适合轻量级场景,要注意脚本自身消耗和报警阈值合理性。
- 适合:单机环境、临时观测、无监控预算的场景
- 先看:脚本获取 CPU 的方式是否准确,避免误报
- 建议:报警渠道先打通,再调整阈值,避免风暴
核心脚本实现
修复了变量展开、小数比较和依赖问题,推荐使用 vmstat 获取数据,比 top 更轻量稳定。
#!/bin/bash
# 获取 CPU 使用率 (100 - idle)
# vmstat 第 15 列通常为 idle%,不同系统可能略有差异,请先手动运行 vmstat 确认
USAGE=$(vmstat 1 2 | tail -1 | awk '{print 100 - $15}')
# 处理可能为空的情况
if [ -z "$USAGE" ]; then
echo "Failed to get CPU usage" >&2
exit 1
fi
# 小数比较,避免 shell 整数比较报错
# 需要安装 bc 命令,或使用 awk 替代
if [ $(echo "$USAGE > 80" | bc) -eq 1 ]; then
# 发送报警 (示例为 curl 发送 webhook)
curl -sX POST "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"CPU Alert: ${USAGE}%\"}}" \
> /dev/null
# 记录日志
echo "$(date) CPU High: ${USAGE}%" >> /var/log/cpu_monitor.log
fi报警渠道配置
现代服务器通常未配置 mail 服务,建议使用 curl 发送 Webhook 到钉钉或企业微信。
钉钉示例:
curl -X POST "https://oapi.dingtalk.com/robot/send?access_token=TOKEN" \
-H 'Content-Type: application/json' \
-d '{"msgtype":"text","text":{"content":"测试报警"}}'注意 JSON 中的双引号在 Shell 脚本中需要转义,或使用单引号包裹。
部署与定时任务
1. 赋予执行权限:chmod +x /usr/local/bin/cpu_monitor.sh
2. 配置 Cron:crontab -e
3. 添加任务(每 5 分钟检查):
*/5 * * * * /usr/local/bin/cpu_monitor.sh
验证与排查
1. 手动测试:运行脚本确认无语法错误,检查日志输出。
2. 压力测试:使用 stress -c 4 模拟高负载,观察是否收到报警。
3. 检查执行记录:查看 /var/log/cron 或 journalctl -u cron 确认任务是否按时触发。
常见坑与优化
- 多核 CPU:vmstat 显示的是所有核的平均 idle,如需单核监控需特殊处理。
- 脚本开销:避免频率过高(如每秒执行),建议间隔不低于 1 分钟。
- 报警风暴:可增加连续触发次数判断,避免瞬间波动导致频繁通知。
- 命令依赖:确保服务器安装了
bc或vmstat,最小化环境需提前验证。