[Bug] run_code 里调用 pwsh 杀进程后会话卡死,工具调用永不返回 #3911
Replies: 2 comments
补充:完整复现与机理(已实测确认)我在本地反复实验后,找到了稳定复现的触发条件,和原帖略有不同——不一定要杀进程,关键在于「带重定向启动常驻控制台进程」。 100% 复现代码await tools.pwsh({
command: "Start-Process node -ArgumentList '-e','setInterval(()=>{},1000)' -RedirectStandardOutput \"$env:TEMP\\r.log\" -RedirectStandardError \"$env:TEMP\\r.err.log\"",
timeoutMs: 12000, description: "repro"
})结果: 工具调用永不返回(实测 67 秒+ 无 tool/result), 12 秒超时完全不生效。 关键现象: 手动杀掉那个 node 进程,卡住的调用 1 秒内返回。 卡点与孙进程持有的句柄直接绑定。 触发边界(逐项实测)
现场观察卡死期间: 执行命令的 PowerShell 进程已经退出, 只有 Start-Process 拉起的 node 孙进程还活着。DSH 的 subprocess 层在等句柄/管道完全释放才结算结果, 这个等待没有超时兜底。 历史卡死(14 分钟那次)结算时间恰好等于用户手动停止的时刻——不是调用完成, 是中止时被强制结算的。 建议修复
环境: Windows 11, dsh 0.1.0-rc.7 (EAC v4Lite), 与第三方插件/桌宠无关, 是执行层自身的问题。 |
|
感谢详尽的复现与变体测试,表格质量很高。我对照公开仓库源码(v0.1.1-rc.2,以及您所用的 0.1.0-rc.7 tag)逐一核对后,发现「结算无超时兜底」这一条与源码不符;另有一条缺口仍然成立。附判别实验帮助定位。 1. subprocess 结算层已有强制兜底(rc.7 与 rc.2 均有) 2. timeoutMs 接线完整 3. 因此矛盾指向两个可能
4. 三个一分钟判别实验
5. 仍然成立的真缺口:正常完成不收割存活孙进程 6. 家族关联:与工具不可抢占/超时家族(#3400/#3477)以及 Windows 句柄相关审计(#3466)同源——孙进程继承管道句柄是 Windows 经典现象。另注:run_code 在 rc.2 已重构(extensions/run-code 并入 core code-runtime,旧的 readline 逐行监听已移除),原复现路径在 rc.2 上行为可能已变化,建议在 rc.2 上重测。 |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Summary
run_code 里调用 tools.pwsh 杀进程(taskkill /F /T 杀 electron)时,pwsh 超时(timeoutMs 30000)后工具调用不返回,没有 tool/result 事件,整个回合卡死,无法继续。
Reproduction
Versions
Notes
All reactions