深度思考
下面是完整正文,直接复制即可("附:提交渠道"那节是给你自己看的,贴给官方时删掉):
Qoder CN CLI 远程控制(remote-control)两个问题反馈
环境:CLI 1.1.80 / 1.1.81,Linux x64(Docker 容器,Ubuntu),账号下环境名 u1-nas(envId 已在公开提交版打码,工单内提供)。以下时间均为 UTC,日志证据在我方留存,可随时提供。
问题一:worker 心跳被 429 限流后,守护进程连接永久冻结(约 3 天不自愈)
现象
守护进程 qoderclicn remote-control --name u1-nas --directory /data/u1/work 正常运行,名下有 3 个活动远程会话(ID 前缀 qs_01m5…,工单内提供完整 ID),各 worker 约每 5 秒发送一次 POST /api/v1/remote/code/sessions//worker/heartbeat。
2026-10-29 17:08:38,服务端对心跳开始返回 429 Too Many Requests(requestId F93AB5F7-A570-467D-8B02-C661262BFD82、A10F1437-FE9F-4391-B2F6-D7DCC4F81DA9)。429 与 204 交替出现(疑似退避重试)。
17:08:54 起守护进程运行日志停止任何输出——无 process.exiting、无重连尝试、无错误摘要。进程与 /proc 条目仍在,但不再收发消息,手机端/Web 显示该环境离线。
此后约 3 天(至 11-01 22:41 我方手动重启守护进程)无任何自愈迹象:日志里没有一次重连、重新注册或退避记录。同一时期环境健康探测(pingEndpoint)、会话心跳是仅有的常规周期性请求,之后全部静默。
期望
收到 429 后按退避重试并最终恢复,而不是永久冻结;
若连接不可恢复,应在退出/挂起前发出明确错误日志,并(理想情况下)进程自杀以便外部 supervisor 重启。
问题二:守护进程重启后,历史远程会话无法续接,且会残留空锁目录
现象
11-02 00:12 将守护进程(1.1.80,11-01 22:41 重启时拉起)升级到 1.1.81 并重启(kill 旧进程 → 新进程 remote-control,同参数、同 envId)。
新守护进程注册完全成功:POST /api/v1/remote/environments/bridge 返回 201,events / events/stream 返回 200,rc.log 显示 Connected,手机端环境列表在线。
但点开 10-29 之前的 3 个历史会话(qs_01m5…),手机/Web 一律显示"连接已断开",无法恢复。反复重启守护进程(1.1.81)结果相同。
绕行方式:在容器内本地会话执行 /remote-control,该会话立刻可被手机/Web 连接。即"会话内模式"正常,"守护进程恢复旧会话"路径不通。
附带问题:worker 随守护进程异常死亡后,projects/-data-u1-work/.jsonl.lock/ 残留空目录(mtime 停在卡死时刻),未见任何进程持锁;删除锁目录后仍无法续接。
另观察到:Capacity 面板显示 Active sessions (0),10-29 卡死前为 3,但会话记录本身完整保留在 projects 目录。
期望
守护进程重启后能从服务端拉回活动会话并 respawn worker(若这是设计行为,请说明前置条件);
worker 异常退出时清理 .jsonl.lock;
无法续接时,客户端给出明确原因(如"该会话所属守护进程已重建"),而不是笼统的"连接已断开"。
复现要点(问题二)
启动 qoderclicn remote-control 守护进程,手机端新建 1 个会话并对话几轮;
kill 守护进程(无活动 worker 时),用相同 --name / --directory 重启;
手机端点开原会话 → 预期可续接,实际"连接已断开";+ 新建会话则正常。
环境补充
容器 CPU 不支持 Bun 优化指令集,使用 baseline 构建(linux/amd64-baseline);
宿主机 NAS(极空间 ZOS)局域网直连,无代理(日志显示 mode=standalone, source=direct, reason=environment-not-configured);
需要原始日志片段、requestId 列表、时间线全文可随时提供。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你这两个问题反馈写得非常扎实,日志、时间线、复现步骤都齐了,官方排查起来会省很多事。直接按这个提交就行,下面说几个实操层面的补充建议:
关于问题一(429后冻结)
这明显是客户端退避逻辑的bug,不是服务端限流本身的问题。临时规避的话,可以给守护进程套个systemd或supervisor,加个健康检查脚本:定期curl心跳接口,连续3次429或无响应就主动kill掉让supervisor拉起,比等它自愈靠谱。
关于问题二(会话无法续接)
大概率是设计如此——守护进程重启后会话ID绑定了旧进程实例,服务端不会自动迁移。那个残留锁目录确实是清理逻辑缺失,删了也没用是因为会话绑定关系已经断了。目前只能接受"重启=新建会话"的现实,重要对话提前导出。
提交渠道提醒
Qoder CN 的工单入口在官网右下角「技术支持」,或者GitHub Issues标签remote-control。贴的时候记得把envId和完整会话ID补上,你正文里打码的部分官方需要原始值才能查日志。