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 在收尾时主动释放,减轻端口占用与资源泄漏带来的干扰。

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

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

Xiaoye