dsh-plugin-process-guard:把 agent 遺留的本機進程列清楚並可釋放

前言

在 DeepSeek Harness(DSH)裏讓 agent 用 Bash 拉起 npm run dev、vite 或 Playwright 時,工具調用結束、超時或切走會話後,子進程往往不會一起退出。在 macOS 上它們可能被重新掛到 launchd 下繼續佔端口和內存:下次啓動報 EADDRINUSE,內存慢慢變少,卻難以從界面上看出「是誰、什麼時候、爲哪個項目起的」。

下面介紹社區插件 dsh-plugin-process-guard(維護者 tf961656585),分類爲 admin-security。它不改動 agent 的啓動方式,只掃描本機已有進程,按項目分組展示,並提供釋放操作;面板與 agent 工具共用同一套邏輯。

這是什麼

dsh-plugin-process-guard 是 DSH 的「本機進程」面板插件:列出 agent 啓動後仍未關閉的 Playwright 瀏覽器與常見開發服務器(dev server),按項目歸類,並支持單條或批量釋放。

DSH 本身遵循「一切皆插件」的擴展方式;社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

核心功能

面板展示

安裝並重啓 DSH 後,左側欄出現服務器圖標,進入「本機進程」。圖標上的小圓點表示仍有建議釋放的進程。

  • 按項目分組,組內顯示進程數;每行包含類型、命令、端口、運行時長、來源會話。
  • 「詳情」可展開完整命令行、進程號與啓動鏈路。
  • 頁面每 12 秒自動刷新;點擊端口號會在瀏覽器打開 http://localhost:<port>。

釋放與確認

  • 「釋放」需點擊兩次(第二次爲確認);5 秒內未確認則自動取消。
  • 「全部釋放」只作用於 agent 啓動、且滿足下列任一條件的進程:啓動它的命令已脫離 DSH,或已運行超過 30 分鐘。不會處理你從終端自行啓動的進程。
  • 插件不會自動殺進程;僅在用戶點「釋放」或 agent 調用 release 時執行。

釋放流程(README 說明):釋放前重新掃描,只對當前快照中仍存在的 pid 操作;對整組(啓動器 + 服務 + 子進程)先發 SIGTERM,約 1.5 秒後仍存活則補 SIGKILL;始終跳過 DSH 自身及其祖先、pid 1、其他用戶的進程。

歸屬與類型判定

進程來源按三類證據從強到弱判斷:

  1. 環境變量中仍有 DSH_SESSION_ID(最可靠,可對齊會話)。
  2. 進程樹仍能連到當前 DSH 進程。
  3. 進程樹連到終端或編輯器(Terminal、iTerm、VS Code、Cursor、Warp 等),或環境中有 TERM_PROGRAM,判爲「你啓動的」。

三者都不成立時顯示「來源不明」。其他 AI 工具遺留的環境標記可識別爲「其他 agent 啓動」,但不冒充 DSH。

項目歸屬:優先用啓動會話的工作目錄,其次用進程 cwd(lsof -d cwd),再向上查找最近的 .git / package.json 等作爲項目根(Playwright 瀏覽器 cwd 常爲 /tmp,故會話工作目錄優先)。

常見類型包括:

  • Playwright:可執行文件位於 ~/Library/Playwright 或 ms-playwright 池且爲主進程(不帶 --type=),GPU / renderer 子進程歸爲一組。
  • 開發服務器:命令匹配 vite、next dev、nuxt、astro、webpack serve、react-scripts start、uvicorn、python -m http.server、wrangler dev 等;node .../node_modules/.bin/vite 會簡化顯示爲 vite。

應用包(.app/Contents/)內進程、DSH 及其祖先、其他用戶的進程不列出、不可殺。

給 agent 的 process_manager 工具

插件註冊 process_manager,能力與面板一致:

  • action=list:列出進程、項目、會話與狀態。
  • action=release:傳 ids(來自 list)或 all=true(釋放所有「需要釋放」的 agent 進程)。

系統提示中會提醒 agent:收尾前檢查並釋放本次啓動且不再需要的 dev server / Playwright。

安裝與啓用

需要先安裝 DeepSeek Harness。README 寫明目前插件只支持 macOS。

在 DSH 的插件安裝界面填寫倉庫地址:

github:tf961656585/dsh-plugin-process-guard

也可填寫該倉庫在本機的絕對路徑。安裝完成後重啓 DSH,左側欄即可出現「本機進程」。

插件以當前 DSH 進程權限運行,安裝前建議通讀倉庫源碼並確認 MIT 許可是否符合你的合規要求。

典型用法

  1. 在 DSH 中通過上述地址安裝插件並重啓。
  2. 正常使用 agent 拉起 dev server 或 Playwright;若工具調用結束但進程仍在,打開左側欄「本機進程」查看分組列表。
  3. 對單條進程點「釋放」並完成二次確認,或對符合條件的一組使用「全部釋放」。
  4. 若希望由 agent 收尾,可調用 process_manager 的 list 與 release(與面板同一套 Host 方法)。

適用場景與限制

適合誰:在 macOS 上用 DSH 做本地前後端或 E2E 開發、經常讓 agent 起長駐進程,且需要可視化清理遺留 Playwright / dev server 的開發者。

限制(來自 README):

  • 僅 macOS;進程識別基於命令特徵,自定義腳本(例如未經過 npm/vite 包裝的 node server.js)可能不會出現在列表中。
  • 會話標題來自 DSH 會話投影緩存;會話已清理時只顯示會話 id。
  • 識別規則無法覆蓋一切啓動方式,「來源不明」條目需謹慎處理。

代碼結構(便於二次閱讀)

倉庫主要文件:

host.js            Host:掃描緩存、三條 HTTP 路由、process_manager 工具、系統提示
scan.js            進程掃描、歸屬判定、項目解析、釋放
client.js          側欄圖標 + 管理面板
locale/*.json      meta.title / meta.description(插件列表用)
test/scan.test.mjs 解析與分類的單元測試

同維護者另有 產品經理看板、技能管理 等 DSH 插件,可按需在社區目錄檢索。

結尾

dsh-plugin-process-guard 補上 agent 長駐進程的可視化與可控釋放這一環:不改變啓動方式,只把已存在的 Playwright 與 dev server 按項目列出來,讓人或 agent 在收尾時主動釋放,減輕端口占用與資源泄漏帶來的干擾。

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

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

小夜