dsh-restart-tool:給 DSH web 一個可靠的重啓與關機開關

前言

用 DSH(DeepSeek Harness)的 web 形態工作時,有一類操作看着簡單、實際容易翻車:重啓服務。裝完插件、改完配置,想讓進程重啓一下,結果常常是「端口關了、服務沒起來」,只能回終端手動再拉一次。

這在 Windows 上不是偶發問題,背後是一串具體的進程機制。dsh-restart-tool 把這些坑逐個處理掉,並提供 agent 模型工具與 GUI 按鈕兩條入口。下面介紹它能做什麼、怎麼裝、怎麼用。

這是什麼

dsh-restart-tool 是一個 DSH 插件,由 julensun-ir 維護,MIT 許可證,當前版本 0.3.0,要求 Node >= 20。一句話定位:爲 dsh web 提供可靠的重啓與關機,入口覆蓋 agent(模型工具 restart_dsh / shutdown_dsh)和 GUI(側邊欄電源控制)。

它針對的核心失敗模式,是 Windows 上「普通重啓以端口關閉、服務未起收場」。README 列出四個踩過的坑,即使不裝這個插件也有參考價值:

  1. 異步 spawn 競態。Node 的 child_process.spawn 在 Windows 上是異步的。helper 在 spawn(...) 之後如果事件循環立即清空,會在進程創建完成前退出——新進程從未被創建,只剩空日誌。修法是等待 'spawn' 事件(失敗重試),或保持事件循環被引用。
  2. agent 沙箱的 kill-on-close job。DSH 給 agent 的 shell 套了 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE job(無 breakaway):宿主一死,agent 的 shell 及它 spawn 的一切全部陪葬。所以 agent 自己無法可靠地「殺掉宿主再拉起」,可靠路徑是讓宿主自己去 spawn helper——宿主的子進程不在這個 job 裏。
  3. Windows 上 SIGTERM 是不可捕獲的硬殺。process.kill(pid, 'SIGTERM') 映射爲 TerminateProcess,優雅關閉處理器不會執行;只有 Ctrl+C(SIGINT)可捕獲。
  4. taskkill /T /F 會連 helper 一起殺。如果 helper 是宿主的子進程,樹殺會把負責拉起新實例的進程連帶幹掉,需要精確殺單個進程,或在樹遍歷時排除自身鏈。

核心功能

按 README 功能表的驗證狀態列出:

能力 入口 驗證狀態
重啓 DSH 模型工具 restart_dsh、GUI 圖標按鈕、POST /dsh-restart/restart Windows 實測
關機 模型工具 shutdown_dsh、GUI 圖標按鈕、POST /dsh-restart/shutdown 機制實測(圍欄 + 路由),實際動作待用戶自行體驗
重啓確認 GET /dsh-restart/status 返回 {"restarted":true,"fromInstanceId":…} 實測
session 自動續跑 重啓前記錄運行中 session,新實例注入 continue nudge 實測(agent 觸發重啓,nudge 已投遞)
健康點 側邊欄狀態圓點,3 秒輪詢,綠/紅/灰 渲染實測
重啓遮罩 + 自動刷新 全屏遮罩,新實例 id 變化後自動 location.reload() 渲染實測
watchdog(可選) 配置開關控制 代碼就緒,未實戰

重啓流程是怎麼跑通的

以 restart_dsh 被調用爲例,鏈路如下:

1、記錄運行中的 session(agent 觸發時,當前 session 也在其中),寫入意圖標記與續跑標記。
2、宿主 spawn 一個 detached helper——它是宿主的子進程,不在 agent 沙箱的 job 裏,宿主死後仍能存活。
3、宿主 2 秒後優雅退出(ctx.appExit),12 秒硬殺兜底。
4、helper 等待端口釋放(最長 90 秒),用相同命令行重新拉起宿主(Windows 上經隱藏控制檯的 powershell 包裝),等待 'spawn' 事件(重試 ×3)確認進程存在。
5、helper 更新 marker.newPid,新實例據此自證重啓成功;helper 再驗證 HTTP 200 後退出。
6、新實例讀取標記(按時間窗口匹配),/dsh-restart/status 開始報告 restarted:true;隨後 tryAutoContinue 輪詢 session 恢復狀態,恢復後注入一次 continue nudge。

安裝與啓用

dsh plugin --profile web add github:julensun-ir/DSH-RESTART-TOOL

也可以本地安裝:

dsh plugin --profile web add file:./dsh-restart-tool

安裝後重啓 dsh 生效。依賴方面聲明瞭三個 peerDependencies:@deepseek-ai/cordis ^4.0.1、@deepseek-ai/dsh-tools ^0.1.0-rc.6、@deepseek-ai/dsh-llm ^0.1.0-rc.6。

可選配置寫在 profile 的 cordis.patch.yml:

- id: dsh-restart-tool
  config:
    watchdogEnabled: true      # 監督者,默認關閉
    watchdogCooldownMs: 60000
    watchdogPollMs: 2000
    autoContinueEnabled: true
    continuePrompt: "The system has restarted. Please continue the work that was in progress."

watchdogEnabled 控制可選的監督者,默認關閉;其餘是冷卻與輪詢間隔、自動續跑開關和續跑提示語。

典型用法

GUI:側邊欄底部出現兩個純圖標按鈕,無文字,避免擠壓相鄰項(如用量統計行)。

  • 刷新圖標 = 重啓:點擊後顯示全屏「Restarting DeepSeek Harness…」遮罩,新實例起來後頁面自動刷新,懸停有提示。
  • 電源圖標 = 關機:優雅關閉,不會自動重啓,之後需手動啓動 dsh。
  • 狀態圓點:綠 = 在線,紅 = 離線/重啓中,灰 = 未知,3 秒輪詢。

HTTP 路由:POST /dsh-restart/restart 與 POST /dsh-restart/shutdown 觸發動作,GET /dsh-restart/status 確認重啓是否完成;路由帶請求來源校驗(isTrustedRequest 圍欄)。

agent:agent 直接調用 restart_dsh 即可;重啓前插件記錄運行中的 session(含觸發重啓的當前 session),新實例恢復後注入 continue 提示。

測試:倉庫自帶零依賴測試套件,基於 Node 內置 node:test:

npm test

套件在單進程內運行——node --test CLI 會按文件開子進程經管道通信,會被 DSH agent 沙箱以 EPERM 阻止。覆蓋範圍包括插件導出、配置形狀、請求圍欄、續跑標記讀寫、工具與路由註冊、健康/狀態路由、自動續跑 nudge、watchdog spawn,以及一次完整的重啓循環(標記 → helper 子進程 → 重新拉起 → newPid → http200=true)。

適用場景與注意

適合誰:在 Windows 上運行 dsh web、希望重啓/關機不必回終端的用戶;希望 agent 能自主完成「改配置 → 重啓 → 續跑」閉環的場景。

使用前有幾點要知道:

1、權限:插件以當前 dsh 進程的權限運行,能在你的機器上拉起與終止進程。安裝前建議閱讀源碼並確認許可證(MIT)。
2、平臺:重啓針對 Windows 場景設計並實測;macOS/Linux 路徑未實測(POSIX 分支存在但未驗證)。
3、關機:shutdown_dsh 僅機制驗證(圍欄、路由、flag 寫入有測試覆蓋),實際關機動作需自行體驗;關機後不會自動重啓。
4、驗證清單餘項:以下 live check 未勾選——新舊 PID 不同且 HTTP 200、agent 觸發重啓的 nudge 投遞、關機後 dsh-stopped.flag 存在且端口停止監聽(其中 helper 的 newPid + HTTP 200、nudge 注入、flag 寫入均有測試套件覆蓋)。
5、watchdog:默認關閉,代碼就緒但未實戰。

如需全平臺的生產級保障,README 同時指出了兩個同類項目可參考:dsh-power-button 與 anweat/dsh-restart。

結尾

dsh-restart-tool 的價值不在「能重啓」——寫個腳本誰都能殺進程——而在於把 Windows 上的每個失敗點都對應處理了一遍,並把「重啓是否成功」做成可查證的閉環:helper 確認 spawn、HTTP 200、標記自證、session 自動續跑。如果你的工作流經常需要重啓 dsh,它值得一看。

順帶說明:DSH 的理念是「一切皆插件」;上面的目錄頁是社區獨立站點,與 DeepSeek、幻方無官方從屬關係。

羽毛球分组比赛记分
小程序二维码

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

小夜