dsh-restart-control:DSH Web 侧边栏重启与状态汇报

前言

在 DSH Web 应用开发中,当需要重启宿主进程时,常见做法是直接关闭页面或重启终端。这会丢失当前会话状态,也无法让宿主按自身的优雅退出路径关闭。dsh-restart-control 插件在 DSH Web 侧边栏底部提供了一个重启控件,允许用户通过点击触发重启,并持续汇报进度直到新进程应答。

这是什么

dsh-restart-control 是一个 DSH Web 插件,由维护者 androidly 维护。它属于「工作流」分类,核心价值是:在 DSH Web 侧边栏底部提供重启控件,让宿主通过自身的优雅退出路径关闭,同时根据环境选择由守护进程拉起或由插件直接启动替代进程,并在右下角持续汇报重启状态。

核心功能

1. 侧边栏重启控件

插件在 DSH Web 侧边栏底部提供一个重启控件。点击一次进入确认态(显示「Click again to restart」),5 秒后确认态自动撤销。再次点击发送重启请求。

2. 优雅退出宿主

插件调用宿主的 ctx.get('appExit'),让宿主通过自身的优雅退出通道关闭。这会先 dispose 插件树,再退出进程,而不是直接杀死进程。

3. 守护进程检测与拉起

插件检测当前环境是否运行在 systemd、Kubernetes 或 Docker 中(分别检查 INVOCATION_ID、KUBERNETES_SERVICE_HOST 和 /.dockerenv):

  • 如果检测到守护进程,插件只退出,由守护进程负责拉起新的宿主实例。
  • 如果没有检测到守护进程,插件自身启动一个分离的后继进程:先等待 2 秒让端口释放,然后使用与当前进程相同的命令行参数、工作目录和环境变量执行 exec。

4. 全帧状态提示

重启过程中,右下角会显示一个全帧提示卡片:

  • 初始状态显示「Restarting…」。
  • 成功后显示「Restarted」或失败原因。
  • 提示卡片提供「Reload page」「Retry」「Dismiss」按钮。
  • 重启尝试记录在 localStorage 中,即使外壳重挂载、页面刷新或重启后打开的新标签页也能看到结果。

5. 基于 PID 的完成验证

完成验证不依赖 HTTP 响应,而是基于 PID:

  • 发送重启请求前,客户端先读取当前宿主的 PID。
  • 发送 POST 请求后,客户端轮询 /restart-dsh,直到返回的 PID 与之前读取的 PID 不同。
  • 这样可以避免误判:一个正在 dying 的进程仍然可能响应请求,但新的 PID 才是真正的后继进程。
  • 轮询最多持续 120 秒,超时后会提示超时信息。

安装与启用

方式一:插件管理器安装

在 DSH Web 的插件管理器中选择「Plugin Manager → install bundle → this package or its directory」,按 bundle 安装即可。

方式二:手动安装

dsh plugin --profile <profile> add <path-or-git-url>

然后编辑 $DSH_HOME/profiles/<profile>/package.json,在 dsh.profile.bundles 数组中添加 dsh-restart-control:

{
  "dsh.profile.bundles": [
    "dsh-restart-control"
  ]
}

最后重启宿主。

路由说明

插件在宿主侧注册了 /restart-dsh 路由:

  • GET /restart-dsh:返回当前宿主的 { pid, startedAt, pending }。
  • POST /restart-dsh:返回 { pid, startedAt, pending, supervisor, relaunch },然后触发重启。如果重启已处于 pending 状态,返回 409。

每个请求首先通过 ctx.connection.requestRejection(req) 进行权限检查,未通过 Host/Origin 围栏或登录 cookie 验证的请求会返回 401,不会读取任何状态或触发重启。

适用场景与注意

适用场景

  • 你使用 DSH Web 开发智能体应用,需要在不丢失太多上下文的情况下重启宿主。
  • 你的宿主运行在 systemd、Kubernetes 或 Docker 等环境中,希望由守护进程负责重启。
  • 你需要在一个页面中查看重启状态,而不需要刷新页面或重新登录。

注意事项

  • 插件需要 DSH Web 版本 0.2.x,并依赖 webServer 和 connection 服务。
  • 重启是进程级的,所有当前会话都会断开,正在进行的请求也会被中断。
  • 守护进程检测是启发式的:如果你运行在未检测到的环境中,插件会使用自身的 relaunch 路径;如果环境本应重启进程但你没有配置守护,插件会启动替代进程,但不会自动重启当前进程。
  • 安装前应检查源码与许可证(MIT)。

结语

dsh-restart-control 为 DSH Web 应用提供了一个可控、可观测的重启入口,让宿主退出和重启过程更加平滑。你可以通过以下链接查看更多细节:

  • 目录页:https://www.skillhub.cn/plugins/androidly/dsh-restart-control
  • GitHub:https://github.com/androidly/dsh-restart-control
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜