Replies: 3 comments
|
这个bug首次出现是我用codex修复被我玩坏的dsh之后忘记了用的codex的沙箱账号,后面给了他一个文件他就满硬盘找,停还停不下来,小扫盘说是 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
[Bug] Windows 下 taskkill 被拒绝时,工具超时/取消无法真正杀掉子进程——工具调用会一直挂起直到命令自然结束
摘要
在 Windows 上,当某个工具调用(如
pwsh)超过timeoutMs或被取消时,它派生的子进程并没有被真正终止。@deepseek-ai/dsh-subprocess-local中的taskkillProcessTree调用了taskkill /T /F,但丢弃了它的退出状态。在受限的 Windows 账户下(例如沙箱专用账户),taskkill会返回ERROR: Access denied,于是"杀进程"静默失败、什么都没做,子进程继续运行。工具调用会一直阻塞到命令自行结束;对于无法结束的命令(例如全盘Get-ChildItem -Recurse),agent 回合会无限挂起,停止按钮也无法停止。环境
0.1.0-rc.6codexsandboxoffline)。在该账户下taskkill /T /F对任何目标都返回ERROR: Access denied——即使是它自己派生的进程也一样(已验证)。而Stop-Process和 Node 的process.kill(pid, "SIGKILL")(映射为TerminateProcess)在同样的上下文中可以正常工作(已验证)。复现步骤
pwsh工具,设置timeoutMs: 4000,命令运行时间更长,例如Start-Sleep -Seconds 20。[timed out after 4000ms],派生的powershell.exe进程一直存活到命令自然结束。期望:调用在 ~4 秒时返回,且派生的进程被终止。
根因
dsh-subprocess-local/lib/index.js中的taskkillProcessTree(pid):spawnSync的返回结果(退出状态 / spawn 错误)从未被检查。当taskkill失败时——受限账户下的 Access denied,或 taskkill 二进制缺失——杀进程实际什么都没做,子进程继续运行。而spawnSubprocess要等子进程的exit/close事件来结束handle.done,所以工具调用(以及整个 agent 回合)会一直阻塞到命令结束或被杀。停止按钮只能取消模型循环,够不到挂死的操作系统进程。补充:
taskkillProcessTree的 JSDoc 本身就写着"nonzero status……不得破坏幂等清理"——nonzero status 恰恰就是这个失败场景,但它目前被静默吞掉了。建议修复(已在本地应用并验证)
process.kill(pid, "SIGKILL")在 Windows 上映射为TerminateProcess,在同样的受限上下文下可用(已验证)。Start-Sleep -Seconds 20+timeoutMs: 4000在 ~4 秒返回[timed out after 4000ms],且无残留的powershell.exe。影响
任何运行时间超过超时上限的工具命令(长时间运行或无法结束的命令——我们的案例是对多个盘符做
Get-ChildItem -Recurse -Include *.pdf -Depth 6的全盘搜索)都会让 agent 回合挂起与命令运行时间等长(我们实测约 20 分钟),并且用户无法停止。取消操作同样受影响,不只是超时。相关
spawnSync返回status: null)。taskkill式失败,可能需要相同的处理(未验证)。All reactions