前言¶
用 DSH(DeepSeek Harness)的 web 形态工作时,有一类操作看着简单、实际容易翻车:重启服务。装完插件、改完配置,想让进程重启一下,结果常常是「端口关了、服务没起来」,只能回终端手动再拉一次。
这在 Windows 上不是偶发问题,背后是一串具体的进程机制。dsh-restart-tool 把这些坑逐个处理掉,并提供 agent 模型工具与 GUI 按钮两条入口。下面介绍它能做什么、怎么装、怎么用。
这是什么¶
dsh-restart-tool 是一个 DSH 插件,由 julensun-ir 维护,MIT 许可证,当前版本 0.3.0,要求 Node >= 20。一句话定位:为 dsh web 提供可靠的重启与关机,入口覆盖 agent(模型工具 restart_dsh / shutdown_dsh)和 GUI(侧边栏电源控制)。
它针对的核心失败模式,是 Windows 上「普通重启以端口关闭、服务未起收场」。README 列出四个踩过的坑,即使不装这个插件也有参考价值:
- 异步 spawn 竞态。Node 的
child_process.spawn在 Windows 上是异步的。helper 在spawn(...)之后如果事件循环立即清空,会在进程创建完成前退出——新进程从未被创建,只剩空日志。修法是等待'spawn'事件(失败重试),或保持事件循环被引用。 - agent 沙箱的 kill-on-close job。DSH 给 agent 的 shell 套了
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEjob(无 breakaway):宿主一死,agent 的 shell 及它 spawn 的一切全部陪葬。所以 agent 自己无法可靠地「杀掉宿主再拉起」,可靠路径是让宿主自己去 spawn helper——宿主的子进程不在这个 job 里。 - Windows 上 SIGTERM 是不可捕获的硬杀。
process.kill(pid, 'SIGTERM')映射为TerminateProcess,优雅关闭处理器不会执行;只有 Ctrl+C(SIGINT)可捕获。 taskkill /T /F会连 helper 一起杀。如果 helper 是宿主的子进程,树杀会把负责拉起新实例的进程连带干掉,需要精确杀单个进程,或在树遍历时排除自身链。
核心功能¶
按 README 功能表的验证状态列出:
| 能力 | 入口 | 验证状态 |
|---|---|---|
| 重启 DSH | 模型工具 restart_dsh、GUI 图标按钮、POST /dsh-restart/restart |
Windows 实测 |
| 关机 | 模型工具 shutdown_dsh、GUI 图标按钮、POST /dsh-restart/shutdown |
机制实测(围栏 + 路由),实际动作待用户自行体验 |
| 重启确认 | GET /dsh-restart/status 返回 {"restarted":true,"fromInstanceId":…} |
实测 |
| session 自动续跑 | 重启前记录运行中 session,新实例注入 continue nudge | 实测(agent 触发重启,nudge 已投递) |
| 健康点 | 侧边栏状态圆点,3 秒轮询,绿/红/灰 | 渲染实测 |
| 重启遮罩 + 自动刷新 | 全屏遮罩,新实例 id 变化后自动 location.reload() |
渲染实测 |
| watchdog(可选) | 配置开关控制 | 代码就绪,未实战 |
重启流程是怎么跑通的¶
以 restart_dsh 被调用为例,链路如下:
1、记录运行中的 session(agent 触发时,当前 session 也在其中),写入意图标记与续跑标记。
2、宿主 spawn 一个 detached helper——它是宿主的子进程,不在 agent 沙箱的 job 里,宿主死后仍能存活。
3、宿主 2 秒后优雅退出(ctx.appExit),12 秒硬杀兜底。
4、helper 等待端口释放(最长 90 秒),用相同命令行重新拉起宿主(Windows 上经隐藏控制台的 powershell 包装),等待 'spawn' 事件(重试 ×3)确认进程存在。
5、helper 更新 marker.newPid,新实例据此自证重启成功;helper 再验证 HTTP 200 后退出。
6、新实例读取标记(按时间窗口匹配),/dsh-restart/status 开始报告 restarted:true;随后 tryAutoContinue 轮询 session 恢复状态,恢复后注入一次 continue nudge。
安装与启用¶
dsh plugin --profile web add github:julensun-ir/DSH-RESTART-TOOL
也可以本地安装:
dsh plugin --profile web add file:./dsh-restart-tool
安装后重启 dsh 生效。依赖方面声明了三个 peerDependencies:@deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-tools ^0.1.0-rc.6、@deepseek-ai/dsh-llm ^0.1.0-rc.6。
可选配置写在 profile 的 cordis.patch.yml:
- id: dsh-restart-tool
config:
watchdogEnabled: true # 监督者,默认关闭
watchdogCooldownMs: 60000
watchdogPollMs: 2000
autoContinueEnabled: true
continuePrompt: "The system has restarted. Please continue the work that was in progress."
watchdogEnabled 控制可选的监督者,默认关闭;其余是冷却与轮询间隔、自动续跑开关和续跑提示语。
典型用法¶
GUI:侧边栏底部出现两个纯图标按钮,无文字,避免挤压相邻项(如用量统计行)。
- 刷新图标 = 重启:点击后显示全屏「Restarting DeepSeek Harness…」遮罩,新实例起来后页面自动刷新,悬停有提示。
- 电源图标 = 关机:优雅关闭,不会自动重启,之后需手动启动 dsh。
- 状态圆点:绿 = 在线,红 = 离线/重启中,灰 = 未知,3 秒轮询。
HTTP 路由:POST /dsh-restart/restart 与 POST /dsh-restart/shutdown 触发动作,GET /dsh-restart/status 确认重启是否完成;路由带请求来源校验(isTrustedRequest 围栏)。
agent:agent 直接调用 restart_dsh 即可;重启前插件记录运行中的 session(含触发重启的当前 session),新实例恢复后注入 continue 提示。
测试:仓库自带零依赖测试套件,基于 Node 内置 node:test:
npm test
套件在单进程内运行——node --test CLI 会按文件开子进程经管道通信,会被 DSH agent 沙箱以 EPERM 阻止。覆盖范围包括插件导出、配置形状、请求围栏、续跑标记读写、工具与路由注册、健康/状态路由、自动续跑 nudge、watchdog spawn,以及一次完整的重启循环(标记 → helper 子进程 → 重新拉起 → newPid → http200=true)。
适用场景与注意¶
适合谁:在 Windows 上运行 dsh web、希望重启/关机不必回终端的用户;希望 agent 能自主完成「改配置 → 重启 → 续跑」闭环的场景。
使用前有几点要知道:
1、权限:插件以当前 dsh 进程的权限运行,能在你的机器上拉起与终止进程。安装前建议阅读源码并确认许可证(MIT)。
2、平台:重启针对 Windows 场景设计并实测;macOS/Linux 路径未实测(POSIX 分支存在但未验证)。
3、关机:shutdown_dsh 仅机制验证(围栏、路由、flag 写入有测试覆盖),实际关机动作需自行体验;关机后不会自动重启。
4、验证清单余项:以下 live check 未勾选——新旧 PID 不同且 HTTP 200、agent 触发重启的 nudge 投递、关机后 dsh-stopped.flag 存在且端口停止监听(其中 helper 的 newPid + HTTP 200、nudge 注入、flag 写入均有测试套件覆盖)。
5、watchdog:默认关闭,代码就绪但未实战。
如需全平台的生产级保障,README 同时指出了两个同类项目可参考:dsh-power-button 与 anweat/dsh-restart。
结尾¶
dsh-restart-tool 的价值不在「能重启」——写个脚本谁都能杀进程——而在于把 Windows 上的每个失败点都对应处理了一遍,并把「重启是否成功」做成可查证的闭环:helper 确认 spawn、HTTP 200、标记自证、session 自动续跑。如果你的工作流经常需要重启 dsh,它值得一看。
- 目录页:https://www.skillhub.cn/plugins/julensun-ir/DSH-RESTART-TOOL
- GitHub:https://github.com/julensun-ir/DSH-RESTART-TOOL
顺带说明:DSH 的理念是「一切皆插件」;上面的目录页是社区独立站点,与 DeepSeek、幻方无官方从属关系。