脚本里 mysqldump 报错退出 任务状态却显示成功 监控上一条告警都没有 第二天才发现备份文件只有几百字节。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

#!/bin/bash
set -euo pipefail
mysqldump -u backup -p$PW app > /tmp/app.sql
gzip -f /tmp/app.sql

管道的退出码只取最后一环 前面 mysqldump 失败 gzip 照样把空流转完并返回 0 整条命令就被当成成功 真正的错误被彻底吃掉 备份文件也就剩个头。这一点先确认清楚,后面就不用反复试。

碰到「shell 管道退出码」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,关键命令之间不要用管道串 先落临时文件再做压缩;bash 里打开 pipefail 让管道中间任何一环失败 整条命令就算失败;脚本开头加 set -e 让错误在当场中断 不继续执行后面的步骤。

改完照着核一遍,故意让 mysqldump 报错 任务退出码变成非 0 监控里能看到失败告警记录。

作者 9823189