前言¶
在 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