#!/usr/bin/env bash set -euo pipefail cp -a /data/app /backup/app rm -rf /data/app.old
备份脚本里 cp 因为磁盘满失败,脚本继续往下执行,最后一步 rm -rf 把源目录删了,第二天要恢复时两头都没有,日志里只有一行 cp: cannot create regular file。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,脚本默认不因为单条命令失败而退出,返回值被忽略,后面的步骤照常跑。cp 失败后目标目录是空的,清理步骤照样执行。
围绕「set -e 缺失」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
处理上按这个顺序:在脚本开头加 set -euo pipefail;对允许失败的命令显式加 || true;清理步骤放在成功判断之后 别无条件执行;故意让 cp 失败一次 确认脚本停在第一步。
改完只确认一件事:把目标目录改成只读再跑,脚本在 cp 处退出,后面的 rm 没有执行。
