avail=$(df -Pk /backup | awk 'NR==2{print $4}')
[ "$avail" -gt 10485760 ] || { echo 'space low'; exit 1; }

/backup 分区用到 100%,备份脚本的 cp 报 No space left on device,接着写了个 0 字节的完成标记,巡检看到标记就认为当天备份成功。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,脚本只在最后写完成标记,没有检查 cp 的退出码,也没有看剩余空间。部分文件已经拷过去,标记文件本身很小,写得进去。

「磁盘满脚本行为」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:开跑前用 df 检查剩余空间 低于阈值直接退出;cp 后判断退出码 失败就删掉半成品;完成标记放在所有校验之后 用 du 核对大小;用 dd 把分区填满 验证脚本会拒绝执行。

改完只确认一件事:分区剩 2GB 时脚本在开始就退出,不会留下完成标记。

作者 9823189