linux中cpu超阈值告警脚本使用mpstat获取稳定使用率,设阈值85%、每2分钟检查,通过锁文件防重复告警,记录日志并支持邮件等多通道通知。

在 Linux 中编写 CPU 超阈值自动告警脚本,核心是定期采集 CPU 使用率、与设定阈值比较、触发通知(如邮件或日志)。不依赖复杂工具,用 shell + top/mpstat/vmstat 即可实现,关键在于采样方式准确、避免误报、通知可靠。
获取真实、稳定的 CPU 使用率
直接用 top -bn1 | grep '%Cpu' | awk '{print $2}' | cut -d'%' -f1 容易受瞬时波动干扰。推荐使用 mpstat(来自 sysstat 包),它提供更平滑的统计:
- 安装:Ubuntu/Debian 运行
sudo apt install sysstat;CentOS/RHEL 运行sudo yum install sysstat或sudo dnf install sysstat - 启用数据收集(确保
/etc/default/sysstat中ENABLED="true",并启动服务:sudo systemctl enable sysstat && sudo systemctl start sysstat) - 脚本中用
mpstat 1 1 | awk '/Average:/ {print 100-$NF}'获取最近 1 秒的平均空闲率,再换算为使用率(更稳定)
编写基础告警脚本(含防抖与日志)
以下是一个生产可用的最小脚本示例(保存为 /usr/local/bin/cpu-alert.sh):
else fi#!/bin/bash
THRESHOLD=85 # 告警阈值(%)
INTERVAL=60 # 检查间隔(秒)
LOGFILE="/var/log/cpu-alert.log"
ALERT_FILE="/tmp/cpu_alert_active" # 防重复告警锁文件
<h1>获取当前 CPU 使用率(取 mpstat 平均值)</h1><p>cpu_usage=$(mpstat 1 1 | awk '/Average:/ {printf "%.0f", 100-$NF}')</p><p>if [ "$cpu_usage" -gt "$THRESHOLD" ]; then
if [ ! -f "$ALERT_FILE" ]; then
echo "$(date): CPU usage ${cpu_usage}% exceeds ${THRESHOLD}% — ALERTING" >> "$LOGFILE"</p><h1>发送邮件(需已配置 mail 命令,如 ssmtp/msmtp/postfix)</h1><pre class="brush:php;toolbar:false;"> echo "CPU high alert on $(hostname) at $(date): ${cpu_usage}%" | \
mail -s "[ALERT] High CPU $(hostname)" admin@example.com
touch "$ALERT_FILE"
# 可选:记录 top 输出辅助排查
top -bn1 >> "$LOGFILE"
fi使用率回落,清除告警状态
if [ -f "$ALERT_FILE" ]; then
echo "$(date): CPU usage back to ${cpu_usage}%, clearing alert" >> "$LOGFILE"
rm -f "$ALERT_FILE"
fi
- 脚本通过
ALERT_FILE实现“告警去重”——只在首次超阈值时发邮件,避免每分钟狂轰滥炸 - 每次检查后都记录日志,含时间、数值、动作,便于回溯
- 务必给脚本加执行权限:
chmod +x /usr/local/bin/cpu-alert.sh
用 cron 定期运行脚本
编辑 root 的 crontab(sudo crontab -e),添加一行:
*/2 * * * * /usr/local/bin/cpu-alert.sh
- 这里设为每 2 分钟执行一次(
*/2),平衡及时性与系统开销 - 不要用太短的间隔(如每 10 秒),
mpstat本身有采样开销,频繁调用反而影响性能 - 确认 cron 环境变量(尤其是
PATH)包含mpstat和mail路径,必要时在脚本开头显式设置:PATH="/usr/local/bin:/usr/bin:/bin"
增强通知方式(可选)
除了邮件,还可快速接入其他通道:
-
企业微信/钉钉机器人:用
curl发 POST 请求,传入 JSON 消息体(需提前获取 Webhook 地址) -
本地桌面弹窗(仅限有 GUI 的服务器):加一句
notify-send "CPU Alert" "Usage: ${cpu_usage}%" -
写入 systemd journal:用
logger -t cpu-alert "High CPU: ${cpu_usage}%",后续可配合journalctl -t cpu-alert查看











