乐于分享
好东西不私藏

OpenClaw 用户注意!你的 cron 命令是不是也报 1000 错误?3 分钟修复,亲测有效!

OpenClaw 用户注意!你的 cron 命令是不是也报 1000 错误?3 分钟修复,亲测有效!

💡 问题现象:执行 openclaw cron list/add/remove 时报错 gateway closed (1000 normal closure),但 openclaw gateway status 正常🔍 根本原因:CLI 插件加载导致 WebSocket 握手超时(硬编码 3 秒)🛠️ 解决方案:修改编译产物中的超时阈值,3 行命令搞定📌 适用版本:OpenClaw v2026.3.13(及受影响的后续版本)⏱️ 修复耗时:2 分钟(含重启)


🤔 问题现象

如果你在执行 OpenClaw 定时任务管理命令时遇到以下错误:

$ openclaw cron listError: gateway closed (1000 normal closure): no close reason

但检查网关状态却是正常的:

$ openclaw gateway status✅ Gateway online (pid 23615, state active)

那么你很可能是遇到了同一个问题:CLI 握手超时。

别慌!这不是你的配置问题,也不是网关挂了,只是一个小小的超时阈值设置~ 😊


🧐 为什么会出现这个问题?

表面原因

CLI 执行 cron 相关命令时,需要先连接到网关的 WebSocket RPC 接口。连接过程中有一个硬编码的 3 秒超时限制

深层原因

OpenClaw 的 CLI 设计是每次执行命令都重新加载所有插件(Feishu、QQ、LCM 等)。当插件数量较多时,初始化过程可能超过 3 秒,导致 WebSocket 握手超时。

简单说:CLI 还没准备好,网关就说"你太慢了,我挂了" 😅

关键代码位于 dist/gateway-cli-*.js

const DEFAULT_HANDSHAKE_TIMEOUT_MS = 3e3;  // 3 秒const getHandshakeTimeoutMs = () => {if (process.env.VITEST && process.env.OPENCLAW_TEST_HANDSHAKE_TIMEOUT_MS) {// 只有测试环境才能覆盖...  }return DEFAULT_HANDSHAKE_TIMEOUT_MS;};

注意看:OPENCLAW_TEST_HANDSHAKE_TIMEOUT_MS 环境变量只有在 VITEST 测试模式下才生效。正常运行时,这个配置被"锁住"了。

为什么 gateway status 能用?

因为 gateway status 和 health 是轻量级命令,不需要加载插件,所以能在 3 秒内完成握手。而 cron list/add/remove 等命令需要完整插件环境,加载时间超过 3 秒就超时了。

类比

  • gateway status → 敲门问"有人在吗?"(秒回)
  • cron list → 敲门后还要把所有工具搬出来展示(超时了)🔧

📋 官方 Issue

这个问题已经被报告到 GitHub:

  • Issue #46892: CLI WebSocket handshake timeout due to plugin loading overhead
  • 状态:✅ 已确认,官方正在考虑添加可配置的超时选项
  • 临时方案:手动修改编译产物(本文方法)

不是你的锅!这是一个已知的共性问题~ 🤝


🛠️ 修复方案(3 行命令,2 分钟搞定)

步骤 1️⃣:修改超时阈值

执行以下命令,将握手超时从 3 秒改为 9 秒:

sed -i 's/const DEFAULT_HANDSHAKE_TIMEOUT_MS = 3e3;/const DEFAULT_HANDSHAKE_TIMEOUT_MS = 9e3;/' \  ~/.nvm/versions/node/v22.22.1/lib/node_modules/openclaw/dist/gateway-cli-*.js

说明

  • 3e3 = 3000 毫秒 = 3 秒 ⏱️
  • 9e3 = 9000 毫秒 = 9 秒 ⏱️
  • 通配符 gateway-cli-*.js 会同时修改所有匹配的文件(通常有 2 个)

步骤 2️⃣:重启网关

openclaw gateway restart

注意:这个命令会中断当前连接,这是正常的。网关会立即重启,大约 5-10 秒后恢复。

步骤 3️⃣:验证修复

$ openclaw cron listID                                   Name                     Schedule                         Next       Last       Status94b1f389-1a18-4ab9-998d-38a82cb52534 国米每周战报             cron 0 10 * * 1                   in 3d      4d ago     ok9d09446e-a2a7-49ed-b356-874537e31763 下班打卡提醒             cron 59 17 * * 1-5                in 3d      1h ago     ok

如果能看到任务列表,说明修复成功!🎉🎉🎉


✅ 验证命令

你可以通过以下命令确认修改是否生效:

grep "DEFAULT_HANDSHAKE_TIMEOUT_MS" \  ~/.nvm/versions/node/v22.22.1/lib/node_modules/openclaw/dist/gateway-cli-*.js

修改前

const DEFAULT_HANDSHAKE_TIMEOUT_MS = 3e3;

修改后

const DEFAULT_HANDSHAKE_TIMEOUT_MS = 9e3;

看到 9e3 就说明改成功了!✅


⚠️ 重要提醒(必看!)

1️⃣ 这是临时修复

修改的是编译后的 JavaScript 文件,不是源码。下次执行 npm update 或重新安装 OpenClaw 时,这些文件会被覆盖,需要重新执行修复命令。

记住这个命令,下次升级后用一下就行:

sed -i 's/const DEFAULT_HANDSHAKE_TIMEOUT_MS = 3e3;/const DEFAULT_HANDSHAKE_TIMEOUT_MS = 9e3;/' \  ~/.nvm/versions/node/v22.22.1/lib/node_modules/openclaw/dist/gateway-cli-*.jsopenclaw gateway restart

2️⃣ 官方修复进展

截至 2026-03-20,官方尚未发布正式修复。建议:

  • 🔍 关注 GitHub Issue #46892 的进展
  • 📦 升级到新版本后,先执行验证命令检查是否被覆盖
  • 🔄 如果又被改回 3e3,重新执行 sed 命令即可(30 秒搞定)

3️⃣ 安全性

这个修改不会影响安全性,只是增加了握手等待时间。9 秒对于本地 WebSocket 连接来说已经非常充裕,不会引入新的风险。✅

4️⃣ 更激进的超时设置

如果你的插件特别多,9 秒还不够,可以改成 15 秒:

sed -i 's/const DEFAULT_HANDSHAKE_TIMEOUT_MS = 3e3;/const DEFAULT_HANDSHAKE_TIMEOUT_MS = 15e3;/' \  ~/.nvm/versions/node/v22.22.1/lib/node_modules/openclaw/dist/gateway-cli-*.js

建议:先从 9 秒开始,不够再加大~


技术细节(可选阅读)

为什么不用环境变量?

代码里其实有环境变量支持:

if (process.env.VITEST && process.env.OPENCLAW_TEST_HANDSHAKE_TIMEOUT_MS) {const parsed = Number(process.env.OPENCLAW_TEST_HANDSHAKE_TIMEOUT_MS);if (Number.isFinite(parsed) && parsed > 0return parsed;}

但注意 process.env.VITEST 这个条件——只有跑测试时才能用。这是开发时的"保险锁",防止用户误配置导致问题。

插件加载开销

以下是典型的插件加载日志(部分):

[plugins] feishu_get_user: Registered feishu_get_user tool[plugins] feishu_search_user: Registered feishu_search_user tool[plugins] feishu_chat: Registered feishu_chat tool...[plugins] ✅ Registered all OAPI tools (calendar, task, bitable, mail, search, drive, wiki, sheets, okr, im)[plugins] [lcm] Plugin loaded (enabled=true, db=/home/chan/.openclaw/lcm.db, threshold=0.75)

当插件数量达到 30+ 时,加载时间很容易超过 3 秒。

WebSocket 握手流程

  1. CLI 发起 WebSocket 连接请求
  2. 网关返回 connect.challenge 事件(含 nonce)
  3. CLI 用 token + nonce 计算认证响应
  4. 网关验证通过,建立连接
  5. CLI 发送 RPC 请求(如 cron.list

整个流程必须在超时时间内完成,否则网关主动关闭连接(1000 正常关闭)。


📝 总结(一键保存)

项目
内容
问题
CLI cron 命令超时,报错 1000 normal closure ❌
原因
插件加载导致 WebSocket 握手超过 3 秒硬编码超时 🐌
修复
sed 修改 DEFAULT_HANDSHAKE_TIMEOUT_MS 从 3e3 改为 9e3 ✅
影响
无副作用,仅增加握手等待时间 🛡️
持久性npm update
 后会被覆盖,需重新修复 📌
官方 Issue
GitHub #46892 🔗

一句话:升级后执行一遍 sed 命令,2 分钟解决问题!⚡


📚 参考资料

  • OpenClaw GitHub: https://github.com/openclaw/openclaw
  • Issue #46892: CLI WebSocket handshake timeout
  • OpenClaw 文档:https://docs.openclaw.ai
  • 本文测试环境:OpenClaw v2026.3.13, Node.js v22.22.1, Linux WSL2

🎁 彩蛋

遇到问题怎么办?

  1. 先看这篇文章(你已经在了!)
  2. 执行修复命令(3 行代码)
  3. 重启网关(1 条命令)
  4. 验证成功(截图发群里炫耀~)

还没解决?

  • 检查是不是 npm update 后又覆盖了
  • 看看 GitHub Issue #46892 有没有新进展
  • 在评论区留言,大家一起帮你!

如果这篇文章帮到了你,欢迎:

👍 点个赞,让更多人看到💬 评论区留言,分享你的修复经验🔄 转发给同样用 OpenClaw 的朋友⭐ Star OpenClaw GitHub,支持开源项目!

祝大家都能顺利解决问题,用得开心! 🎉🦞💪