前言¶
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 進程的權限運行,使用前請檢查源碼與許可證。