重启后保留的内容
优雅重启会先排空任务
请求的重启(openclaw gateway restart、需要
重启的配置更改或 Gateway 网关更新)不会立即终止正在进行的工作。
Gateway 网关会停止接受新工作,然后等待活跃的智能体轮次和
后台任务完成,最长不超过排空预算(默认为 5 分钟)。因此,大多数
重启根本不会中断任何工作。
只有无法在排空预算内完成的工作(或因强制重启或崩溃而中断的任何运行)
才会被中止——而在此之前,每个
受影响的会话都会被标记为需要恢复。
如何检测中断的工作
三种互补机制会标记轮次未完成的会话:- **轮次准入时:**对于现有主会话中的普通文本轮次,
Gateway 网关会追加用户消息、将会话标记为正在运行,并在模型或
before_agent_reply钩子执行之前,通过一次 SQLite 事务记录 其恢复递送声明。Control UI 会在返回started确认之前执行此操作;渠道分派则在准备好的轮次 接管智能体运行时执行此操作。 命令、附件、每轮次覆盖项、待处理递送、先前的中止提示、 插件拥有的会话以及带有执行钩子的轮次会继续使用各自的 专用准入路径。 如果安装了before_agent_reply钩子,准入还会记录其阶段。 恢复绝不会重放在调用途中中断的钩子。未处理的钩子 完成后,其检查点会记录该结果,但只要该钩子仍处于活动状态, 恢复仍会采取失败关闭策略:检查点无法证明重启后加载的是相同的 插件代码和配置。已处理的文本结果和 静默结果会分别设置检查点,以便进行确定性结算。 旧版本写入的持久恢复声明没有来源所有权 标记,因此在升级期间也会接受相同的失败关闭钩子检查。 - **关闭时:**在重启排空期间,每个存在活跃运行的会话 都会在运行被中止前,在会话存储中加上恢复标记。
- **启动时:**Gateway 网关会扫描会话存储,查找仍 声称正在运行、但在新进程中没有活动所有者的会话。这可以捕获 未执行任何关闭代码的严重崩溃和进程终止。同时还会清理过期的转录记录锁 文件。
自动恢复
启动几秒后,Gateway 网关会重新分派每个已标记的会话, 并附带一条合成的系统消息,告知智能体其上一个轮次 因重启而中断,并要求它从现有转录记录继续。如果 最终回复已经生成但尚未递送,其文本会一并提供, 以便智能体直接递送,而不是重新执行工作。 启动协调处理会采用指数退避,最多重试三次瞬态故障。 此外,每个中断的主会话周期都有 三个计费自动分派尝试的持久预算,该预算会跨 Gateway 网关重启保留。OpenClaw 会在分派前计入一次尝试;如果 Gateway 网关在接受请求前明确拒绝请求,则退还此次尝试;如果 分派后的结果不确定,则保留计费,以避免重放工作。 已拥有该会话的前台工作会阻止自动恢复进入, 直到该工作完成。 持久预算耗尽后,会为该会话设置墓碑,而不是 让它无限循环。检查失败的会话,并使用/new 或 /reset 启动
替代会话。openclaw doctor --fix 可以修复与墓碑
冲突的过期中止标志,但不会重新启用该恢复周期。
每次重试都会复用同一个持久分派标识符,因此不明确的连接
故障无法重复启动同一次恢复。已完成和无法恢复的 Control
UI 轮次也会保留有界的持久幂等性墓碑,使
重新连接的发件箱能够将其清除,而无需重新执行请求。
仅通过消息工具发送的回复会使用第二种持久关联。在终结性的
同一对话发送到达渠道之前,Gateway 网关会在确切的会话和来源轮次上
记录一个未解决的递送意图。确认提供商
成功后,该意图会解析为持久的已递送回执;确认失败后则会将其清除。
恢复可以直接完成已递送回执,而无需重新运行工具。如果崩溃
导致提供商结果未知,恢复会采取失败关闭策略,而不是重放
外部效果。
已递送的回复还会连同其来源
消息 ID 镜像到转录记录中。终结性镜像使用独立的回执键,因此使用
相同提供商幂等键的进度发送不会掩盖终结标记。来自
旧轮次的进度发送和回执无法完成当前轮次。只有
持久的渠道入口声明才能恢复消息操作权限。恢复后的
运行会保留原始来源递送模式和来源关联,包括
请求者身份以及任何同渠道/线程限制,因此即使
恢复期间再次重启,同一回执仍然具有权威性。无法重建渠道权限的
仅消息工具轮次会采取
失败关闭策略,并收到一次性的重新发送通知。
恢复前,Gateway 网关会检查转录记录尾部是否可以安全地
从中继续。如果不能(例如,轮次终止于过期的待处理
审批),则不会盲目重新运行该会话;智能体会改为发布一条简短
通知,请用户重新发送最后一个请求。对于 WebChat,该通知会
直接写入会话历史记录,以便重新连接后仍然可见。
OpenClaw 还可以重建中断的只读代码模式
工作。代码模式会将这些运行标记为重启安全,并在具有副作用的
目录工具或插件命名空间执行前拒绝它们。如果重启发生在
wait 控制项上,新 Gateway 网关会根据其转录记录重建轮次,
并强制重建后的执行保持重启安全,即使
模型省略或清除了该标志。主机会将整个重建
轮次限制为经过审计的只读核心工具和明确可安全重放的插件工具,
即使重启后禁用了代码模式也是如此。具有副作用的工作
仍会由重新发送通知进行保护,而不会冒重复写入的风险。
子智能体
子智能体运行会持久化到共享 SQLite 状态数据库中,因此 子智能体注册表可以跨进程保留。启动时会恢复注册表,并使用原始任务上下文 恢复中断的子智能体会话。 有两项安全阀:- 超过 2 小时前中断的运行会被完成处理,而不是恢复,因此 停机一整夜的 Gateway 网关不会重新唤起过期工作。
- 反复恢复失败的会话会被设置为卡死墓碑,使 恢复无法无限循环。
后台任务
后台任务注册表以 SQLite 为后端, 并会在启动时和定期周期中进行协调处理:恢复已完成运行记录的 持久结果;所属进程已消失的运行会在 宽限期后标记为已丢失,而不是永远挂起。智能体请求的重启
当智能体自身触发重启(应用配置更改、更新 Gateway 网关或显式请求重启)时,会在进程退出前将重启哨兵写入 SQLite。启动后,Gateway 网关会将结果发回 原始聊天,并分派一个一次性继续轮次,使 智能体恰好从中断处继续,并保持在同一渠道和线程中。 哨兵的类型化 SQLite 列是重启处理的权威来源; 其payload_json 值仅用于重放/调试影子。运行时读取、写入
和清除 SQLite 状态,不使用文件回退。在存储切换期间,
启动时以及通过 Doctor 会运行有界状态迁移,以保留
更新后旧进程留下的、经过验证的 restart-sentinel.json。
迁移会验证类型化行并删除源文件,然后再继续正常的
重启处理。
安全阀和可观测性
- **崩溃循环断路器:**5 分钟内发生 3 次非正常启动会触发断路器, 在下次启动时阻止自动启动辅助服务,从而避免崩溃中的 Gateway 网关 放大自身问题。非正常启动时间窗口清空后,它会恢复。
- **主会话尝试预算:**每个中断周期有三次计费自动分派尝试; 预算耗尽后会为该会话设置墓碑,直到它被 检查并替换。
- **指标:**恢复活动通过
Prometheus 导出为
openclaw_session_recovery_total和openclaw_session_recovery_age_seconds。 - **日志:**恢复决策记录在
main-session-restart-recovery和subagent-interrupted-resume子系统下。
不会恢复的内容
- 因已有其他所有者负责处理而排除在主会话恢复之外的会话: 子智能体会话(由子智能体恢复处理)、cron 会话(调度器会按计划 重新运行)以及 ACP 管理的会话(由连接的 IDE 或客户端负责恢复)。
- 转录记录尾部无法安全继续的会话;这些会话会收到 上述重新发送通知,而不是静默重新运行。
- 从未准入的工作:在排空窗口期间到达的消息 会被拒绝并返回明确的重启错误,而不是静默排入 即将终止的进程。
- 独立的嵌入式轮次无法接管存在待处理
重启恢复的主会话,因为它们不共享 Gateway 网关的生命周期所有者。
请通过 Gateway 网关运行该轮次,或在那里使用
/new或/reset重置它。