SiriusWJ/dsh-restart-btn0

dsh-restart-btn

重启 Web 服务按钮:在设置页 General 区添加一行重启按钮,宿主端复用桌面启动器的机制(node + lib/bin.js、日志重定向、TCP 就绪轮询)重启 dsh web,页面断开后自动重连。

包名
dsh-restart-btn
版本
1.1.0
许可证
MIT
最近更新
2026年9月11日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:SiriusWJ/dsh-restart-btn

dsh-restart-btn

在 DSH 设置页 General 区加一行「重启 Web 服务」按钮:点一下就把 dsh web 重启一遍, 用于让插件 / 主题 / 配置改动生效,不用再去双击桌面快捷方式。

页面会在服务重启期间短暂断开,服务回来后自动重新载入——不需要手动刷新。

为什么会有这个插件

在 Windows 上重启 dsh 有个隐蔽的坑:调度任务(schtasks /TR)的命令行是按ANSI 代码页 写入的,只要命令里出现非 ASCII 字符(例如中文工作区 ...\OneDrive\文档\txt2),路径就会被 静默损坏——任务照样报 Last Result: 0(成功),但脚本一行都没执行

早期版本把重启脚本写进「客户端传来的工作区路径」,在这些机器上表现为: 点重启完全没反应,也没有任何报错。

本版本的处理方式:

  1. 重启助手脚本固定放在纯 ASCII、无空格的暂存目录(%LOCALAPPDATA%\dsh-restart-btn, 不可用时依次退到 %ProgramData% / %SystemRoot%\Temp / %TEMP% / ~/.dsh), 调度任务的命令行里因此永远只有 ASCII。
  2. 所有用户相关路径(node、bin.js、工作目录、日志、启动器)走 UTF-8 JSON 配置文件, 完全不进命令行。
  3. 助手脚本本身是纯 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 重定向到日志文件(与快捷方式一致,崩溃才查得到)
5TCP 轮询就绪(最多 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