💡 问题现象:执行
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 restart2️⃣ 官方修复进展
截至 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 > 0) return 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 握手流程
CLI 发起 WebSocket 连接请求 网关返回 connect.challenge事件(含 nonce)CLI 用 token + nonce 计算认证响应 网关验证通过,建立连接 CLI 发送 RPC 请求(如 cron.list)
整个流程必须在超时时间内完成,否则网关主动关闭连接(1000 正常关闭)。
📝 总结(一键保存)
| 问题 | |
| 原因 | |
| 修复 | DEFAULT_HANDSHAKE_TIMEOUT_MS 从 3e3 改为 9e3 ✅ |
| 影响 | |
| 持久性 | npm update |
| 官方 Issue |
一句话:升级后执行一遍 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
🎁 彩蛋
遇到问题怎么办?
先看这篇文章(你已经在了!) 执行修复命令(3 行代码) 重启网关(1 条命令) 验证成功(截图发群里炫耀~)
还没解决?
检查是不是 npm update 后又覆盖了 看看 GitHub Issue #46892 有没有新进展 在评论区留言,大家一起帮你!
如果这篇文章帮到了你,欢迎:
👍 点个赞,让更多人看到💬 评论区留言,分享你的修复经验🔄 转发给同样用 OpenClaw 的朋友⭐ Star OpenClaw GitHub,支持开源项目!
祝大家都能顺利解决问题,用得开心! 🎉🦞💪
夜雨聆风