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