前言¶
在 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),按項目歸類,並支持單條或批量釋放。
- 倉庫:github.com/tf961656585/dsh-plugin-process-guard
- 社區目錄:skillhub.cn/plugins/tf961656585/dsh-plugin-process-guard
- 許可:MIT(見倉庫 LICENSE)
- 當前包版本(package.json):0.1.0
- 平臺:僅支持 macOS(依賴
ps、lsof、ps eww讀進程環境)
DSH 本身遵循「一切皆插件」的擴展方式;社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
核心功能¶
面板展示¶
安裝並重啓 DSH 後,左側欄出現服務器圖標,進入「本機進程」。圖標上的小圓點表示仍有建議釋放的進程。
- 按項目分組,組內顯示進程數;每行包含類型、命令、端口、運行時長、來源會話。
- 「詳情」可展開完整命令行、進程號與啓動鏈路。
- 頁面每 12 秒自動刷新;點擊端口號會在瀏覽器打開
http://localhost:<port>。
釋放與確認¶
- 「釋放」需點擊兩次(第二次爲確認);5 秒內未確認則自動取消。
- 「全部釋放」只作用於 agent 啓動、且滿足下列任一條件的進程:啓動它的命令已脫離 DSH,或已運行超過 30 分鐘。不會處理你從終端自行啓動的進程。
- 插件不會自動殺進程;僅在用戶點「釋放」或 agent 調用
release時執行。
釋放流程(README 說明):釋放前重新掃描,只對當前快照中仍存在的 pid 操作;對整組(啓動器 + 服務 + 子進程)先發 SIGTERM,約 1.5 秒後仍存活則補 SIGKILL;始終跳過 DSH 自身及其祖先、pid 1、其他用戶的進程。
歸屬與類型判定¶
進程來源按三類證據從強到弱判斷:
- 環境變量中仍有
DSH_SESSION_ID(最可靠,可對齊會話)。 - 進程樹仍能連到當前 DSH 進程。
- 進程樹連到終端或編輯器(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 許可是否符合你的合規要求。
典型用法¶
- 在 DSH 中通過上述地址安裝插件並重啓。
- 正常使用 agent 拉起 dev server 或 Playwright;若工具調用結束但進程仍在,打開左側欄「本機進程」查看分組列表。
- 對單條進程點「釋放」並完成二次確認,或對符合條件的一組使用「全部釋放」。
- 若希望由 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 在收尾時主動釋放,減輕端口占用與資源泄漏帶來的干擾。