怎么写 Shell 脚本监控 CPU 使用率超过 80% 报警?

文章导读
对于单台服务器或临时排查场景,直接用 Shell 脚本配合 crontab 定时任务是最快落地的方案,但如果是集群或长期监控,建议优先使用现成的监控系统。
📋 目录
  1. 核心脚本实现
  2. 报警渠道配置
  3. 部署与定时任务
  4. 验证与排查
  5. 常见坑与优化
A A

对于单台服务器或临时排查场景,直接用 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

怎么写 Shell 脚本监控 CPU 使用率超过 80% 报警?

2. 配置 Cron:crontab -e

3. 添加任务(每 5 分钟检查):

*/5 * * * * /usr/local/bin/cpu_monitor.sh

验证与排查

1. 手动测试:运行脚本确认无语法错误,检查日志输出。

2. 压力测试:使用 stress -c 4 模拟高负载,观察是否收到报警。

3. 检查执行记录:查看 /var/log/cronjournalctl -u cron 确认任务是否按时触发。

常见坑与优化

  • 多核 CPU:vmstat 显示的是所有核的平均 idle,如需单核监控需特殊处理。
  • 脚本开销:避免频率过高(如每秒执行),建议间隔不低于 1 分钟。
  • 报警风暴:可增加连续触发次数判断,避免瞬间波动导致频繁通知。
  • 命令依赖:确保服务器安装了 bcvmstat,最小化环境需提前验证。