一个真实事故

早年写过一个部署脚本,逻辑是「删旧目录 → 拉新代码 → 构建 → 启动」。某次构建失败,脚本中断在半路,线上目录已经删了,新代码没构建出来,站点直接挂了。

修复花了二十分钟,但教训记到现在。

三条原则

一、每一步都要可重入

好脚本不假设「我上次肯定跑完了」。判断条件写在动作前面:

if [ ! -d "$TARGET" ]; then
  mkdir -p "$TARGET"
fi

而不是直接 mkdir 然后祈祷它别报错。

二、先备份,再破坏

任何删除、覆盖、迁移操作,前面必须有备份步骤,而且备份要能验证:

BK="/root/backup_$(date +%s)"
cp -r "$SRC" "$BK" || { echo "备份失败,中止"; exit 1; }
[ -d "$BK" ] || { echo "备份校验失败,中止"; exit 1; }

注意 || { ...; exit 1; }——备份失败必须阻断后续操作,而不是继续往下跑。

三、失败要能回去

部署脚本最后应该打印回滚命令。哪怕只是简单一句:

echo "如需回滚:cp -r $BK/* $SRC/"

出事的时候人在焦虑状态,不想再去翻历史命令。

一个检查清单

写完脚本,问自己四个问题:

  1. 这个脚本连跑两次会怎样?
  2. 如果它在第 3 步失败,系统处于什么状态?
  3. 怎么回到执行前的状态?
  4. 失败时我知道是哪一步挂的吗?

四个都能答上来,脚本才算能用。

← 返回博客

评论

发表回复

您的邮箱地址不会被公开。必填项已用 *