linux脚本出错时应立即告警而非等执行完毕,核心是每步后检查退出状态(用||或$?),告警含主机名、脚本路径与行号、错误片段,通过邮件+webhook双通道发送,并加锁防重复告警。

Linux 脚本出错时自动发送告警,关键不是等脚本跑完再检查日志,而是让错误一发生就立刻通知。核心是捕获失败、构造有效信息、用可靠通道发出。
每步命令后立即判断退出状态
不要依赖最后统一汇总。在关键操作后加判断逻辑,出错即停、即报:
- 用
||连接错误处理块,例如:tar -czf /backup/data-$(date +%F).tar.gz /data || { echo "备份压缩失败" >&2; send_alert "tar 失败"; exit 1; } - 或显式检查
$?:rsync -a /src/ user@dst:/dst/ if [ $? -ne 0 ]; then send_alert "rsync 同步异常,退出码 $?" exit 1 fi
告警内容要带上下文,不能只说“错了”
运维最怕模糊通知。上报信息至少包含三项:
- 主机名(
$(hostname)) - 脚本路径和出错行号(可用
$0和$LINENO) - 前几行 stderr 输出(如
2>&1 | head -n 5捕获)
示例消息体:【备份失败】 主机:web01 脚本:/opt/scripts/backup.sh 第 42 行 错误:rsync: failed to connect to dst: Connection refused (111)
通知通道选稳不选快,优先邮件+Webhook双备
邮件最通用:确保系统已配好
mail命令(如s-nail或mailx),测试通再上线;-
Webhook 更及时:钉钉/企业微信只需一条
curl,但必须加超时和简单重试:curl -m 10 -s -X POST "$WEBHOOK_URL" \ -H 'Content-Type: application/json' \ -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MSG\"}}" # 若失败,3秒后重试一次 if [ $? -ne 0 ]; then sleep 3; curl -m 10 ...; fi 避免单点依赖:不要只靠一种方式,脚本里可先发邮件,再尝试 Webhook。
防止误报和刷屏,加基础防护机制
- 错误上报前加锁文件或时间戳标记,比如 5 分钟内同类错误只报一次:
LOCK="/tmp/backup_fail_lock" if [ -f "$LOCK" ] && [ $(($(date +%s) - $(cat "$LOCK"))) -lt 300 ]; then exit 0; fi echo "$(date +%s)" > "$LOCK"
- 对非致命步骤(如发邮件失败)用
|| true容错,避免因通知环节卡住主流程。
不复杂但容易忽略











