Linux脚本实现可靠异常告警需四步:先配置SMTP确保邮件可达;再嵌入CPU、内存、磁盘、进程等轻量检测逻辑;然后在邮件中包含主机名、时间戳和具体指标值;最后通过标记文件防重复、检查返回值和记录日志防静默失败。

Linux 脚本通过邮件发送系统异常告警,核心是“检测异常 + 触发邮件”,关键在于确保邮件能可靠发出,而不是只写个 mail 命令就完事。
确认系统已配置可用的邮件发送能力
很多 Linux 系统默认没装或没配好邮件服务,mail 或 sendmail 命令可能发不出去。先验证:
- 运行
echo "test" | mail -s "test" your@email.com,看是否收到 - 若失败,推荐用
ssmtp或msmtp配置 SMTP(比如走 Gmail、企业邮箱或腾讯企业邮),比本地 sendmail 更稳定 - 配置好后,测试脚本里调用
printf "CPU >90%" | mail -s "ALERT: High CPU" admin@example.com
在脚本中嵌入轻量级异常检测逻辑
告警不是越频繁越好,要避免误报和刷屏。常见实用检测方式:
- CPU 使用率:用
top -bn1 | grep '%Cpu' | awk '{print $2}' | cut -d'%' -f1取用户态使用率,>90 持续 2 次再告警 - 内存剩余低于 500MB:
free -m | awk 'NR==2{print $7}' - 磁盘使用超 90%:
df / | awk 'NR==2{print $5}' | sed 's/%//' - 关键进程消失:
pgrep nginx >/dev/null || echo "nginx down" | mail -s "Service Down" ...
加时间戳、主机名和简明上下文,方便快速定位
光说“CPU 高”没用,运维看到得立刻知道在哪台、什么时候、什么程度:
- 邮件正文里至少包含:
$(hostname)、$(date)、具体指标值(如$(top -bn1 | ...)) - 示例片段:
echo -e "$(date)\nHost: $(hostname)\nCPU usage: $(top -bn1 | grep '%Cpu' | awk '{print $2}' | cut -d'%' -f1)%\nMemory free: $(free -m | awk 'NR==2{print $7}') MB" | mail -s "[ALERT] $(hostname) CPU spike" admin@example.com
避免重复告警和静默失败
一次故障反复发 10 封邮件很烦人;发不出去却以为成功更危险:
- 用临时标记文件(如
/tmp/cpu_alerted_$(date -d 'yesterday' +%F))控制 24 小时内同类告警最多发一次 - 检查
mail命令返回值:if ! echo "alert" | mail -s "test" x@x.com; then logger "Mail failed"; fi - 把告警日志记到
/var/log/monitor.log,方便回溯是否真发了、发给谁、啥内容


















