dsh-restart-btn
重启 Web 服务按钮:在设置页 General 区添加一行重启按钮,宿主端复用桌面启动器的机制(node + lib/bin.js、日志重定向、TCP 就绪轮询)重启 dsh web,页面断开后自动重连。
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:SiriusWJ/dsh-restart-btn说明文档
阅读完整 README ↗dsh-restart-btn
在 DSH 设置页 General 区加一行「重启 Web 服务」按钮:点一下就把 dsh web 重启一遍,
用于让插件 / 主题 / 配置改动生效,不用再去双击桌面快捷方式。
页面会在服务重启期间短暂断开,服务回来后自动重新载入——不需要手动刷新。
为什么会有这个插件
在 Windows 上重启 dsh 有个隐蔽的坑:调度任务(schtasks /TR)的命令行是按ANSI 代码页
写入的,只要命令里出现非 ASCII 字符(例如中文工作区 ...\OneDrive\文档\txt2),路径就会被
静默损坏——任务照样报 Last Result: 0(成功),但脚本一行都没执行。
早期版本把重启脚本写进「客户端传来的工作区路径」,在这些机器上表现为: 点重启完全没反应,也没有任何报错。
本版本的处理方式:
- 重启助手脚本固定放在纯 ASCII、无空格的暂存目录(
%LOCALAPPDATA%\dsh-restart-btn, 不可用时依次退到%ProgramData%/%SystemRoot%\Temp/%TEMP%/~/.dsh), 调度任务的命令行里因此永远只有 ASCII。 - 所有用户相关路径(node、bin.js、工作目录、日志、启动器)走 UTF-8 JSON 配置文件, 完全不进命令行。
- 助手脚本本身是纯 ASCII,并用显式 UTF-8 解码器读 JSON——绕开 PowerShell 5.1 默认按 ANSI 读文件的第二个坑。
它怎么重启
复刻桌面快捷方式(start-dsh.ps1)验证过的机制,而不是另发明一套:
| 步骤 | 做法 |
|---|---|
| 1 | 延迟若干秒,让 HTTP 响应先回到浏览器 |
| 2 | 找到监听该端口的进程,taskkill /T /F 连子进程一起结束 |
| 3 | 轮询等端口真正释放 |
| 4 | `Start-Process web --port |
| --no-open`,stdout/stderr 重定向到日志文件(与快捷方式一致,崩溃才查得到) | |
| 5 | TCP 轮询就绪(最多 45s)——不用 HTTP 探测,避免把「401 未授权」误判成失败 |
| 6 | 直连启动失败时,回退执行桌面启动器 %LOCALAPPDATA%\DeepSeekHarness\start-dsh.ps1(它自带自愈与浏览器拉起) |
服务端身份(instance)在每次进程启动时不同,前端只有在 ping 到另一个 instance 时才刷新页面,
因此不会把「还没死掉的旧服务」误认成「新服务已就绪」。
安装
# 本地目录
dsh plugin --profile web add D:/Code/dsh/restart-btn-plugin
# 或从 GitHub
dsh plugin --profile web add github:SiriusWJ/dsh-restart-btn
改完 bundle 需要重启一次 dsh 生效(第一次请手动重启)。
路由
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /dsh-restart-btn/restart | 同源校验;body {"port":"3080"};返回 instance / log / trigger |
GET | /dsh-restart-btn/ping | 返回 {ok, instance, pid},供页面判断新进程是否就绪 |
日志与排错
| 文件 | 内容 |
|---|---|
%LOCALAPPDATA%\dsh-restart-btn\restart.log | 重启全过程(停进程 / 端口释放 / 启动 / 就绪 / 失败原因 + stderr 尾部) |
%LOCALAPPDATA%\dsh-restart-btn\dsh.out.log | 新服务的 stdout |
%LOCALAPPDATA%\dsh-restart-btn\dsh.err.log | 新服务的 stderr |
若暂存目录不是 %LOCALAPPDATA%(用户名含非 ASCII 时会自动退到 %ProgramData% 等),
以 POST /dsh-restart-btn/restart 返回的 log 字段为准。
已知取舍
- 启动时带
--no-open,重启不会弹新标签页;页面靠自身轮询重连。想改成弹新标签, 把lib/index.js里生成的--no-open去掉即可。 - 端口取自浏览器地址栏,因此非 3080 端口也能正确重启。
- 仅 Windows 走 Task Scheduler + PowerShell 路径;其他平台需自行改
buildHelperScript()。
License
MIT