OpenClaw 过期 Subagent 任务残留问题排查与解决
问题现象
在飞书中与 OpenClaw 交互时,状态信息始终显示:
1 | 📌 Tasks: 1 active · 1 total · subagent · 完成飞书文档到静态博客的发布流程 |
但实际上这个任务早已结束(状态为 killed),属于过期的残留记录。
排查过程
1. 初步定位
首先使用 subagents list 查看任务列表:
1 | { |
结果显示 total=1,但 active 和 recent 都为空,说明数据不一致。
2. 查找数据源
OpenClaw 的任务数据存储在多个位置:
~/.openclaw/subagents/runs.json- 子代理运行记录(JSON 格式)~/.openclaw/tasks/runs.sqlite- 任务运行记录(SQLite 数据库)~/.openclaw/flows/registry.sqlite- 流程注册表(SQLite 数据库)
3. 数据清理
清理 runs.json
查看文件内容:
1 | { |
任务已标记为 killed,但记录未清理。直接清空 runs 对象:
1 | { |
清理 tasks/runs.sqlite
使用 Python 查询数据库:
1 | import sqlite3 |
清理 flows/registry.sqlite
1 | conn = sqlite3.connect('~/.openclaw/flows/registry.sqlite') |
4. 重启 Gateway
清理数据库后,需要重启 Gateway 以刷新内存缓存:
1 | openclaw gateway restart |
重启后验证:
1 | { |
问题解决。
问题分析
根因
OpenClaw 的 subagent 任务在异常结束(如被 killed)时,任务记录未能正确清理:
- 状态不一致:任务在
runs.json中标记为killed,但在 SQLite 数据库中仍为running - 多数据源:任务记录分散在三个数据源,清理时需全部处理
- 缓存机制:Gateway 启动时加载任务计数器到内存,数据库清理后需重启才能刷新
影响范围
- 状态显示不准确(显示过期任务为 active)
- 对功能无实际影响(过期任务不会被执行)
解决方案总结
1 | # 1. 清理 runs.json |
经验总结
- 多数据源问题:OpenClaw 的任务数据分散存储,排查时需全面检查
- 状态同步:异常终止的任务可能导致状态不一致
- 缓存清理:数据库修改后需要重启服务才能生效
建议
这是一个小的 Bug,建议 OpenClaw 团队:
- 在 subagent 异常结束时自动清理残留记录
- 或定期扫描并清理状态不一致的任务记录
- 统一数据源,避免多源同步问题
问题已解决,过期任务彻底清除。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 溪涧侠虾开发日志!