前言¶
DeepSeek Harness(DSH)的理念是「一切皆插件」。在本地开发或调试时,如果 dsh 的 agent 运行在 web 服务进程内部,直接通过命令杀掉 web 进程(如 Stop-Process),等于杀掉了 agent 所在的进程树,导致重启命令无法执行,出现“自杀式重启”的问题。
dsh-web-restart 通过 WMI (Win32_Process.Create) 将新服务进程创建在 WMI 宿主下,使其完全脱离 agent 进程树。加载该插件后,服务挂了会自动拉起;需要加载新代码时,可以通过 flag 触发脱管重启。
这是什么¶
这是一个 DSH bundle 插件,用于确保或重启 DeepSeek Harness 的 web 服务。它由 LnsiAxe 维护,采用 MIT 许可证。
安装与启用¶
安装前请确保 DSH 版本大于等于 0.1.0-rc.6。
# 在 headless profile 下安装,用于服务挂了时通过任务复活 web 服务
dsh plugin --profile headless add @lnsiaxe/dsh-web-restart
# 在 web profile 下安装,用于启用 flag 文件触发重启功能
dsh plugin --profile web add @lnsiaxe/dsh-web-restart
# 启动 dsh web,插件会在加载时生效
dsh web
核心功能¶
该插件提供两种运行模式和一个触发机制:
- ensure 模式(默认):检查端口是否监听。未监听时脱管启动,已监听时不做任何操作。
- rotate 模式:检查端口是否监听。已监听时脱管重启(调用方返回后 kill 再拉起),未监听时直接启动。
- flag 文件触发:在 web profile 下运行时,创建特定 flag 文件,下一个会话回合开始时插件会删除 flag 并脱管重启服务。
典型用法¶
场景一:服务挂掉后
# 运行 headless 任务,插件会在 boot 时自动拉起 web 服务
dsh --profile headless "启动 web 服务"
场景二:加载新代码后重启
# 1. 在 web profile 下创建 flag 文件
New-Item C:\Users\<you>\.dsh\dsh-web-restart.flag
# 2. 发送一条消息触发新回合
# 插件检测到 flag,删除 flag 并重启 web 服务
配置¶
通过 cordis.patch.yml 配置端口和模式:
- insert:
- id: web-restart
name: '@lnsiaxe/dsh-web-restart'
config:
port: 3080 # web 服务端口
mode: ensure # ensure | rotate
# workspace: C:\Users\<you>\my-workspace # 可选,默认取进程 cwd
# gitDir: C:\Users\<you>\git\cmd # 可选,默认 ~\git\cmd(给 side-panel 的 git 用)
工作原理¶
- 脚本生成:激活时,插件会在
DSH_HOME目录下生成dsh-web-restart-launch.cmd和dsh-web-restart-rotate.cmd。这两个脚本负责设置环境变量、切换目录并执行node ... web --port <port>。 - 进程启动:通过 PowerShell 的
Invoke-CimMethod Win32_Process.Create调用 WMI。在 Windows 平台上,新进程的父进程是 WMI 宿主,因此不受 agent/服务进程树的回收影响;非 Windows 平台则回退为spawn(..., { detached: true }).unref()。 - 自重启跳过:插件在 web profile 里加载时会检测
argv是否包含web,如果包含则跳过自重启逻辑,仅响应 flag 触发。
注意事项¶
- 平台依赖:Windows 平台依赖 WMI;非 Windows 平台使用 detached spawn。
- 版本要求:需要 DSH 版本
0.1.0-rc.6及以上。 - 权限安全:插件以当前 dsh 进程的权限运行,使用前请检查源码与许可证。