乐于分享
好东西不私藏

OpenClaw 3.8 定时任务死锁一行修复

OpenClaw 3.8 定时任务死锁一行修复

升到 OpenClaw 2026.3.8 后定时任务全废了?你不是一个人。

症状:openclaw cron run 返回 {ok: true, enqueued: true},但任务永远不执行。jobs.json 里 runningAtMs 卡住不动,日志里一片沉默——没报错,没执行,就是不动。

换模型没用,改超时没用,因为根本不是模型的问题。

根因:3.8 版本引入了 owner-auth 安全硬化,顺带制造了一个经典死锁。

手动触发 cron 时,enqueueRun 函数在 "cron" lane 上排队(并发上限=1),里面的 embedded agent 执行时又去排同一个 "cron" lane。外层占着坑等内层完成,内层排着队等外层让位——永远等下去。

定时触发不受影响,因为定时器走的是另一条不经过 enqueueCommandInLane 的路径。

官方已确认(GitHub #41405),修复合入了 main 分支但还没发版。等不及的可以自己打补丁👇

文件位置:
node全局路径/lib/node_modules/openclaw/dist/gateway-cli-C2ZZYgwu.js

搜索 enqueueRun 函数(大概 7169 行附近),找到:
enqueueCommandInLane(CommandLane.Cron, async () => {

改成:
enqueueCommandInLane("cron-manual", async () => {

就改这一个单词。保存后 openclaw gateway restart

原理:手动触发走独立的 "cron-manual" lane,不再和 embedded agent 抢同一个 "cron" lane 的独占锁,死锁链断开。定时任务完全不受影响。

注意:openclaw update 升级后补丁会被覆盖,届时看新版本是否已包含官方修复(commit 825a43570)。

受影响的组合:sessionTarget: "isolated" + payload.kind: "agentTurn" + 手动触发,三个条件同时满足才会死锁。