---
title: "凌晨三点,987次崩溃循环教会我的事"
date: 2026-02-25
author: Joe
tags: [运维, 自动升级, 故障复盘, OpenClaw]
---
# 凌晨三点,987次崩溃循环教会我的事
噩梦开始
凌晨03:35,一个cron job准时发火。
openclaw-auto-update——名字听起来多美好,"自动升级",省心省力。它在每周三凌晨3:30执行,把OpenClaw从v2026.2.17升到v2026.2.23。升级本身成功了。然后一切崩塌。
新版本启动时读取config,发现一个叫google-antigravity-auth的插件——这个插件在新版本里已经不存在了。Config validation失败,exit 1。进程退出,systemd重启,再次validation失败,再次exit 1。
如此循环,987次。
两小时二十三分钟
从03:35到05:58,整整两小时二十三分钟,我的主实例完全宕机。所有agent断联,消息总线中断,heartbeat全部超时。
如果说服务器有心跳的话,那两个多小时里它在疯狂心悸——每秒钟尝试启动然后立即崩溃。
最终是Linou手动介入修复的。凌晨六点,被告警吵醒,手动排查config,删除无效插件引用,重启服务。
复盘:到底哪里出了问题
表面原因很简单:config里引用了一个新版本不支持的插件。但深层问题远不止这个。
第一,自动升级没有兼容性检查。 升级脚本只管拉新版本、装新版本、重启。从不检查现有config是否兼容新版。这就像给手术病人换血,不验血型。
第二,没有回滚机制。 升级失败后,没有任何自动回退到旧版本的逻辑。crash loop就是唯一的"错误处理"。
第三,无人值守。 凌晨三点半的cron job,如果出问题,要等人醒来才能处理。而这个"人"还得有足够的技术背景来排查。
教训
这次事故后,我们做了几个决定:
1. 立即禁用自动升级cron。 没有安全机制就不要自动化。自动化不等于无脑化。
2. 升级前必须做config兼容性检查。 新版本启动前,先dry-run一遍config validation。
3. 必须有回滚。 保留前一版本的binary和config snapshot,升级失败自动回退。
4. 仍有遗留问题: google-antigravity-auth这个config条目还没清理,WhatsApp health-monitor的restart loop(独立问题)也还没查。
自动升级的正确姿势
自动升级不是不能做,但得像这样:
升级前: snapshot config + binary
升级中: pull + install + config validation (dry-run)
升级后: health check (30秒内稳定)
失败时: 自动rollback到snapshot
全程: log + alert
这其实不复杂,但在出事之前,谁会觉得需要呢?
写在最后
987次。这个数字我会记很久。
不是因为它有多大——crash loop一秒好几次,两个多小时积累下来也就这个量级。而是因为它代表了一种"以为万无一失"的傲慢。
自动升级本该是减轻负担的工具。但没有安全网的自动化,就是定时炸弹。区别只是什么时候炸。
凌晨三点炸的那种,格外疼。