dsh-bash-watchdog:在 pnpm 装卸插件前清掉 win-bash 常驻进程

前言

在 Windows 上使用 DeepSeek Harness(DSH)时,若同时启用 @linxin666/dsh-win-bash,每个会话会常驻一个位于插件包目录内的 bash.exe。官方插件管理器或插件市场通过 pnpm 更新、卸载插件时,需要「删除旧目录 → 重命名新目录」;Windows 不允许替换正在执行的映像,于是常见 ERR_PNPM_EPERM,插件目录只替换一半甚至损坏。事后手动杀进程或重启 Harness 能救场,但属于补救。下面介绍 Host 插件 dsh-bash-watchdog(维护者 daedal0us,社区分类 admin-security):在 Harness 真正执行 pnpm 装卸/更新之前,自动结束 win-bash 留下的常驻 bash.exe,把「等 pnpm 失败再收拾」改成「在 rename 之前先释放文件锁」。

这是什么

dsh-bash-watchdog 是纯 Host 插件:无 UI、无网页资源、无 npm 依赖(仅使用 node: 内置模块),在 Windows 上加载即参与监听与清理;在 POSIX 上直接 inert,不参与任何路径。

清理不经过 pwsh 工具,也不依赖当前会话里挂着哪个 shell:Host 用 execFile 启动 Windows PowerShell 子进程,通过 Get-Process 与 Stop-Process 结束目标进程。因此即便 win-bash 默认 replacePwsh: true 把 pwsh 从工具面隐藏,插件管理器与插件市场的 pnpm 操作仍会被保护。

故障链在 README 中写得很具体:win-bash 常驻 → 可执行文件在包内 → pnpm 替换目录 → EPERM → 插件树半残。看门狗针对的是这一链,不是泛化的「杀所有 bash」。

触发时机与活动窗口

覆盖 Harness 内会真正跑 pnpm 的几类入口,外加持久 shell 守卫:

触发源 信号 为何够早
官方插件管理器(事件) plugin-manager/install-state 的 installing、plugin-manager/install-log 的首条 pnpm 输出 installing 在查 registry 时即发出,早于 pnpm 启动
官方插件管理器(文件) <profile>/.plugin-manager/logs/operation-* 新目录 管理器在 spawn pnpm 之前 mkdir 并写 pnpm.log
插件市场(dshmarket) <profile>/.dsh-market/log.ndjson 的 install / update-start / uninstall-start 等 市场在动 pnpm 前先写意图
Agent 一次性 shell pwsh 等工具命令含 pnpm install/update/add/remove/... 或 dsh plugin ... 工具派发前先清锁
持久 shell 守卫 win_bash 内指向 DSH profile 的 pnpm 变更 杀 shell 会腰斩命令;拒绝比写坏插件树更安全

每次触发打开「活动窗口」:窗口内每 2 秒复查,pnpm 解包期间其它会话新起的 win-bash 也会被清掉。操作结束(如 plugin-manager/changed、市场日志完成、tools/post-execute)时窗口提前收窄。README 给出的实测:安装 pnpm 约 1.28 s 时,自 operation 目录出现到 bash 被杀约 0.31 s;卸载约 0.54 s 时约 0.30 s,均早于 pnpm 完成删除/替换。

只杀该杀的

不是 taskkill /IM bash.exe。看门狗按可执行文件路径逐个检查,默认只杀路径中包含 dsh-win-bash 的 bash.exe(可通过 bashPathPatterns 改子串)。Git for Windows 等其它 bash 不会被误杀。优先 Stop-Process -Force;被拒绝时退回 taskkill /T /F。

与两条 bash 扩展线并存:官方一次性/持久 bash 的路径通常不含 dsh-win-bash,不会被误杀;win-bash 包内 runtime\...\bash.exe 会被清掉。若有人把官方持久 bash 的 shellPath 手动指向 win-bash 包内可执行文件,则按 win-bash 进程处理——默认配置不会出现。

replacePwsh 与 win_bash 里的 pnpm

@linxin666/dsh-win-bash 默认 replacePwsh: true 时,仅 restrict({ deny: ['pwsh'] }),不影响 Host 的 execFile 与管理器/市场的触发。插件管理器与市场路径照常被保护。

在 win_bash 里对 DSH profile 跑 dsh plugin ...、cd <profile> && pnpm update 等变更命令时,看门狗会 deny 并说明原因(指向管理器/市场,或建议 replacePwsh: false 后用 pwsh)。原因是:pre-execute 杀的是旧 shell,win_bash 会为该命令新起仍在包目录内的 bash,杀与不杀都无法安全完成 profile 上的 pnpm 替换。项目目录内的 pnpm 不受影响。

若希望 Agent 直接用 shell 跑 profile 上的 pnpm,README 建议:将 win-bash 的 config.replacePwsh 设为 false,重启一次 DSH 让 pwsh 回到工具面,再用 pwsh 执行。

安装与启用

README 给出的安装方式是在本机工作区对插件目录执行 install_bundle(plugin_manager 的 target 为绝对路径):

{ "action": "install_bundle", "target": "C:\\Users\\daeda\\Documents\\Programming\\dsh-bash-watchdog" }

请把 target 换成你本机 checkout 或解压目录的实际路径。安装成功后打开即生效,README 写明无需重启。按绝对目录安装时 pnpm 使用 link: 指向该目录;移动或删除目录会使 profile 条目失效,需重新 install_bundle。

当前 package 版本为 0.1.2(以仓库 package.json 为准),要求 Node >=22,许可证 MIT。

配置要点

配置写在 profile 的 cordis.patch.yml 对应插件行的 config 下,键均可省略。常用项包括:

- id: dsh-bash-watchdog
  name: dsh-bash-watchdog
  config:
    bashPathPatterns: ['dsh-win-bash']
    activeWindowMs: 120000
    sweepIntervalMs: 2000
    watchPluginManagerLogs: true
    watchMarketLog: true
    interceptShellTools: true
    shellToolNames: ['pwsh', 'bash', 'shell', 'terminal', 'run_command']
    persistentShellToolNames: ['win_bash']
    denyProfilePnpmInPersistentShell: true
    sweepOnStartup: false

完整键说明与默认值见 GitHub README。win_bash 在 persistentShellToolNames 而非 shellToolNames,与「杀进程无法保护正在 win_bash 内执行的 profile pnpm」的模型一致。

日志与边界

默认日志路径为 <DSH_HOME>/logs/dsh-bash-watchdog.log,JSON Lines 记录 activate、killed(含 pid 与路径)等;超过 maxLogBytes(默认 1048576)会轮转为 .log.1。

务必了解的边界(均来自 README):

  1. 只覆盖 Harness 自己发起的 pnpm 操作(管理器、市场、dsh plugin CLI、Agent 经 pwsh 等入口)。系统终端里裸跑 pnpm update 且无上述触发信号时,看门狗不动作。
  2. 持久 shell 内的 profile pnpm 是拒绝而非保护;项目目录 pnpm 不受影响。
  3. 只处理可执行文件在包目录内的 bash 锁;DSH 自身加载的 .node 原生模块无法靠杀 bash 解决,需重启 DSH 后再替换。
  4. 活动窗口内会结束正在跑的 win-bash 命令(含构建/测试),窗口在操作结束时收窄。

适用场景与注意

适合:Windows 上长期使用 DSH,启用 @linxin666/dsh-win-bash,并频繁通过插件管理器、插件市场或 Agent 的 pnpm/dsh plugin 装卸插件的开发者。

插件以当前 DSH 进程权限在 Host 侧执行进程枚举与结束操作;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认行为符合本机安全策略。社区目录 SkillHub 插件页 与 GitHub 无 DeepSeek / 幻方官方从属关系,属于「一切皆插件」生态中的第三方条目。

结尾

经过上面的步骤,dsh-bash-watchdog 把 win-bash 与 pnpm 目录替换之间的锁冲突前移到「pnpm rename 之前」处理,并区分一次性 shell 清理与持久 shell 内 profile pnpm 的拒绝策略。若你正被 ERR_PNPM_EPERM 与半残插件目录困扰,可先对照 README 安装 Host 插件,再按需调整 replacePwsh 与 cordis.patch.yml。

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

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

小夜