[bug] 后台任务挂死导致对话整体冻结:job_output(wait:true) 无活性信号,agent 陷入重复等待 #1542
Replies: 3 comments
This is a UI-observability / agent-policy gap rather than a profile-manifest bug: a hung background subprocess yields Two points worth emphasizing (all consistent with the author's asks):
No offline-detectable manifest symptom here (it depends on runtime job state); out of |
|
补充一下本机真实复现(Windows 11 + dsh 0.1.0-rc.6,桌面壳/便携版构建场景),两个方向都在这套数据里得到印证:
维护者提的 |
|
补一个 macOS 上的样本,形态略不同:子进程没有挂死,而是活着但长期零输出, 环境:dsh 时间线(session-18d94bd5,2026-09-03):agent 以 最小改动建议: |
Uh oh!
There was an error while loading. Please reload this page.
一句话摘要
后台任务里的子进程挂死(6 分钟 0 CPU、无网络、无子进程)后,
job_output(wait: true)把整个回合锁死;超时返回的信息只有[status: running],没有任何“最后输出时间 / 进程活性”数据,agent 无法区分“慢”和“卡死”,于是再次wait: 240s,形成无限循环。最后只能靠外部人工杀进程才能恢复。环境
dsh webprofile,Windows)完整时间线(Asia/Shanghai,2026-08-15)
run_in_background: true启动后台任务(job_id:pwsh-2),脚本共 5 步:构建 bridge 插件 → 注册进 web profile → 构建 Chrome 扩展 → 复制到~/.dsh/browser-extension→ 打印 profile 状态job_output(job_id: pwsh-2, timeout_ms: 300000, wait: true)pnpm exec dsh plugin --profile web add <link 绝对路径>中的pnpm add写完所有文件:profile 的 package.json、pnpm-lock.yaml、node_modules junction、.modules.yaml、.pnpm-workspace-state-v1.json,并打印了完成摘要("Done in 2.2s using pnpm v11.7.0")pnpm add进程(PID 27956)存活但完全静止:4 秒采样 0 CPU、0 网络连接、0 子进程,持续约 6 分钟。因为脚本里该步骤的输出接了2>&1 | Select-Object -Last 6(缓冲全部输出、管道关闭才吐出),pnpm 的完成摘要被压在管道里;期间job_output读到的只有 "=== 2. 注册进 web profile ===" +[status: running][status: running]job_output(wait: true, timeout_ms: 240000)——进入“每次等 4-5 分钟”的循环,对话从用户视角完全冻结pnpm add叶子进程job_output返回完整输出,对话恢复后遗症:
dsh plugin add的 bundles 调和步骤只在 pnpm 退出码为 0 时执行(lib/plugin-*.js 中if (exitCode === 0) reconcilePlugins(...)),被杀进程退出码非 0,所以dsh.profile.bundles没有自动补上新插件;agent 事后自己检查并手动修正。任务最终全部完成。根因归属
挂死本身大概率不是 DSH 的管道问题,而是 pnpm 11.7.0 在 Windows 上“干完活、打印完摘要后不退出”的已知症候(见 pnpm#9530:
pnpm install完成后无限挂起 - Windows;另见 Windows 句柄相关问题 pnpm#9961)。我核实过 DSH 侧的两处实现,都没有“管道不读导致死锁”的经典错误:dsh-subprocess-local对收集型流持续stream.on("data")排空,超出内存上限落盘 spill 文件,不会背压;dsh plugin命令本身用spawnSync(pnpm, { stdio: "inherit", shell: true })直通继承句柄,不经过管道缓冲。(如维护者需要,我可提供
pnpm --debug/--reporter=append-only日志或最小复现脚本,但本次只发生一次,触发条件尚未定位,不敢声称确定性复现。)希望 DSH 侧改进的点(即使挂点是 pnpm)
job_list/job_output的返回里增加lastOutputAt(最后一条输出时间,最好再加进程树 CPU 增量或“idle since”)。这样 agent 就能执行策略:“运行中 + N 分钟无新输出 → 判定卡死 → job_kill”,而不是无限 wait。目前返回的只有文本 +[status: running],信息量为零。| Select-Object -Last N、| Out-String这类“攒到管道关闭才输出”的写法会掩盖活性(有输出也不可见),建议后台任务改用直写文件(> log 2>&1)或不缓冲的输出,这样 liveness 数据也才有意义。复现提示
非确定性复现路径:Windows + pnpm 11.7.0,后台任务内执行
pnpm exec dsh plugin --profile web add <link:绝对路径>(目标 profile 正被dsh web服务占用时可能更容易触发),随后 agent 对 job 使用job_output(wait: true)长等待。低概率出现 pnpm 完成写入后不退出。DSH 侧的问题(无活性信号导致 wait 死循环)在任意一个“后台任务挂死”场景下都能稳定观察到,无需 pnpm 复现即可独立讨论。All reactions