dsh-web-restart:從界面重啓 DSH Web 服務

在 DSH 的插件化架構中,升級 host 或修復插件後通常需要重啓服務。以往需要手動在終端執行 kill 命令,且運行中的會話會被中斷。dsh-web-restart 插件通過 UI 提供重啓入口,並配合獨立的監督進程處理真正的服務重啓,同時支持自動恢復被中斷的會話。

核心功能

  • 界面重啓:在側邊欄底部提供重啓按鈕,支持任何佈局。
  • 狀態監控:通過圓點顏色指示服務與監督進程狀態(綠=運行中,黃=排隊中,紅=未運行)。
  • 確認機制:點擊按鈕後彈出居中確認框,防止誤觸。
  • 自動繼續:重啓後自動掃描並恢復被中斷的會話(需配置開啓)。
  • 崩潰自愈:服務意外退出時,監督進程可自動拉起服務。

安裝與啓用

1. 安裝插件

在終端中執行以下命令安裝插件:

dsh plugin --profile web add dsh-web-restart

安裝完成後,重啓 DSH web 服務以生效。

2. 部署監督進程

插件本身只負責發送重啓請求,真正的 kill + start 操作由獨立的監督進程執行。安裝插件後,必須手動部署監督進程,否則按鈕將顯示紅色狀態。

  1. 複製腳本:
    mkdir -p ~/.dsh/scripts
    cp scripts/dsh-web-supervisor.sh ~/.dsh/scripts/ && chmod +x ~/.dsh/scripts/dsh-web-supervisor.sh
  1. 配置 launchd:
    cp scripts/com.dsh.web-supervisor.plist.example ~/Library/LaunchAgents/com.dsh.web-supervisor.plist
    # 編輯 plist 文件,將 YOUR_USER 替換爲實際用戶名
    launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.dsh.web-supervisor.plist
  1. 驗證狀態:
    等待約 5 秒後,執行以下命令檢查狀態:
    ~/.dsh/scripts/dsh-web-supervisor.sh status
輸出 `running` 且 UI 按鈕變爲綠色點表示部署成功。

3. 配置自動繼續

在 設置 → 插件 → 插件配置 中,找到“重啓服務設置”卡片,開啓“重啓後自動繼續中斷的會話”開關並保存。

監督進程機制

插件運行在 DSH web 進程內部,無法直接殺死宿主進程(會導致自身隨宿主一同退出)。因此,插件僅作爲請求方,真正的服務重啓由 launchd 託管的監督進程執行。

監督腳本(dsh-web-supervisor.sh)負責輪詢請求文件、執行停止與啓動、處理端口釋放,並在服務崩潰時自動拉起。如果啓動失敗,它會將錯誤日誌寫入監督日誌文件,便於排查。

自動繼續邏輯

當開啓自動繼續功能後,服務重啓完成(約 2 秒後)會執行一次掃描:

  1. 掃描範圍:僅恢復上次啓動標記之後被中斷的會話。
  2. 恢復條件:識別被強制終止(進程被殺)或因非用戶原因中止的會話。用戶主動停止的會話不會被恢復。
  3. 恢復行爲:
    • 頂層會話及其子代理會被恢復。
    • 如果有 active goal,會自動重新武裝並繼續運行。
    • 如果沒有 active goal,會注入一條合成消息提示繼續之前的工作。

相關文件與命令

  • 請求文件:~/.dsh/dsh-web.restart-request
  • 運行狀態:~/.dsh/dsh-web-restart.json
  • 監督日誌:~/.dsh/dsh-web-restart.log
  • 服務日誌:~/.dsh/dsh-web.log

常用命令:

# 查看監督進程狀態
~/.dsh/scripts/dsh-web-supervisor.sh status

# 徹底停止守護進程
~/.dsh/scripts/dsh-web-supervisor.sh halt

已知限制

  • 在 include 方式掛載的部署(如倉庫 link: 工作區插件)下,插件配置卡片可能因命名空間原因在 UI 中不顯示。此時可使用重啓彈窗內的開關,或直接編輯 ~/.dsh/settings.yaml 文件。
羽毛球分组比赛记分
小程序二维码

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

小夜