Repository navigation
[Bug] 桌面版更新被永久拒绝:Host 已确认 shutdown-complete,却因 10 秒内未退出被 SIGTERM(0.2.0-rc.2 → 0.2.1-rc.2) #10204
Replies: 4 comments
|
遇到相同的问题 |
|
同样是这个错误: |
|
补充一个 macOS Apple Silicon 的同类实例,以及“取消定时任务后更新成功”的线索。 环境与现象
与楼主的 实际观察到的恢复过程
这是一次真实的“取消任务前失败 / 取消任务后成功”的观察,尚未重新创建同一任务反复验证。也没有记录精确到失败瞬间的调度状态,因此暂不能确定是未来待触发的计时器、正在投递的任务,还是调度与退出之间的竞争造成了延迟。 可供排查的方向检查过出问题的 建议优先检查 schedule 的等待/投递在应用退出时是否被取消和回收,以及更新准备阶段是否可能继续触发调度。可以补充“有待触发的重复任务,但没有前台生成”及“恰好到期投递”两个退出/更新测试,并记录 shutdown-complete、进程 exit、close 各自的时间。 预期是更新过程能够暂停并回收调度中的活动资源,保留持久化任务供重启后恢复;用户不应需要取消自己的定时任务才能安装更新。 补充边界:这个 profile 有第三方插件,包括带本地修改的 English summary: On macOS arm64, the |

Uh oh!
There was an error while loading. Please reload this page.
DSH 桌面版更新失败:Host 已完成任务清理却无法在 10 秒内退出,导致更新被永久拒绝
1. 环境
D:\ai tools\deepseek harness(per-user 安装,注册表HKCU\...\Uninstall)nightly,feedhttps://download.deepseek.com/dsh-desk/feeds/win-x64/0.2.0-rc.2→ 目标0.2.1-rc.2(该缺陷在 0.2.1-rc.2 上同样存在,见 §6)2. 现象
在应用内点击更新 → 下载成功(
pending\deepseek-harness-0.2.1-rc.2-win-x64.exe已落盘)→ 确认安装后弹出错误对话框:
DeepSeek Harness 更新未能安全停止任务,更新尚未安装,请稍后重试。安装器从未被执行,版本停留在 0.2.0-rc.2;外壳随后走恢复分支把 Host 重新拉起,工作区仍可用。
重试任意次数结果完全相同。
3. 复现步骤
不依赖任何特定任务内容:空会话、无后台作业时同样复现。
4. 证据
4.1 进程与网络
失败发生期间,Host 子进程(
DeepSeek Harness.exe --expose-internals ... dsh-desktop-host)常驻持有:同样的形态在升级到 0.2.1-rc.2 后依旧(新端口 64905、
Listen+ 多条Established),说明这不是某个版本特有的残留进程,而是 Host 进程的常态。
4.2 已下载安装包的可信性(排除下载/校验问题)
即:不是包有问题,也不是落盘失败,纯粹是安装前的停机闸门拒绝了它。
5. 代码路径与根因分析
5.1 判定逻辑(外壳侧,
lib/types/host-process.js)更新确认流程(
confirmDesktopUpdateInstall)在backend.stop()之前置requireCleanStop = true,随后把该错误包装成
DesktopUpdatePreparationError("stop-failed", updateStopFailed),安装被放弃。5.2 Host 侧的停机顺序(
dsh-desktop-host)5.3 关键矛盾
报错里同时出现:
shutdown acknowledged true→ Host 已经跑完shutdown.shutdown(0)并回传shutdown-complete;graceful deadline exceeded true→ 但进程本体在 10 秒内没有退出。两者并存说明:任务清理是成功的,卡住的是清理之后的事件循环——
stop()结束后只做了process.disconnect(),没有process.exit(),也没有显式关闭监听套接字 / keep-alive 连接。只要有任一 handle 存活(§4.1 里的监听端口或 TLS 长连接),Node 进程就不会自然退出,于是必然吃满
10 秒、必然收到 SIGTERM、必然被判
unclean。5.4 因此设计上的判定过严
requireGraceful用的是合取:graceful && exitCode === 0 && shutdownCompleted。但
shutdownCompleted === true本身就意味着状态已落盘、插件已卸载——此时进程是否立刻消失,与数据安全无关。把「清理完成但进程残留句柄」与「清理没完成」同等对待,会让受影响机器永远无法通过
UI 更新;而绕过它的唯一办法(杀掉应用后手跑安装包)反而比自动路径风险更高,这与该闸门的安全意图相反。
6. 建议修复(任选其一即可解除阻塞,建议 1 + 2 都做)
shutdown-complete之后setImmediate(() => process.exit(0));或在
application.shutdown里显式server.close()+ 关闭所有连接、http.Agent.destroy()、unref 定时器,保证事件循环可清空。
shutdownCompleted为 true 时允许更新继续(必要时先 SIGTERM 再继续),仅在真正清理未确认 时才拒绝安装。
process._getActiveHandles()的类型统计,这样同类问题的报告能直接定位残留句柄,而不是只能看到
signal SIGTERM。7. 当前变通做法
退出应用后直接执行已下载的安装包(
pending\deepseek-harness-0.2.1-rc.2-win-x64.exe,/S静默亦可),注册表版本随即变为
0.2.1-rc.2。已验证可行,但需要用户手动操作,且不是官方支持的更新路径。All reactions