You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
背景
Windows 11 下以
pnpm dsh web运行时,子进程/shell 工具链存在一批平台相关缺陷:进程树终止在 Windows 上没有优雅阶段、后台孙进程继承管道时输出会被强截、spill 文件权限位在 Windows 不生效、持久 bash 超时配置存在 30s/300s 错位、win32 组合下默认shellPath指向不存在的/bin/bash。问题 1:[中] Windows 下 SIGTERM/SIGKILL 均走 taskkill /T /F,无优雅终止阶梯
位置:
packages/subprocess/subprocess-local/src/spawn.ts:297-299(signalTreewin32 分支直接taskkill(pid))+439-453(terminate()的 TERM→grace→KILL 升级)现象:
terminate()本意是 SIGTERM → graceMs 宽限 → SIGKILL 的优雅升级,但signalTree在 win32 上对任意信号值都调用taskkillProcessTree,后者固定taskkill /PID ... /T /F。两个台阶都是强杀,设了清理 trap 的命令在超时/被中断时没有机会执行清理。复现:
trap 'echo CLEANUP' EXIT; sleep 300实际结果:Windows 上
CLEANUP永远不会打印,进程树被瞬间强杀;同一命令在 POSIX 下会走优雅 SIGTERM。建议:win32 上保留一个真实优雅阶段(如先不带
/F的taskkill /T或发 CTRL_BREAK,宽限后仍未退出再/F),并让工具描述与实际行为一致。问题 2:[低] 后台孙进程继承管道:直接子进程 exit 后 graceMs 强关收集流,输出截断且 done 被拖慢
位置:
spawn.ts:472-497(child.on('exit')里pipeDrainTimer = setTimeout(..., graceMs)后强destroy()收集流)现象:命令
bash -c 'sleep 5 & echo done'中 bash 立即退出,但后台sleep继承了 stdout 管道。exit事件后要再等 graceMs 才 settle,且到点后流被destroy(),孙进程后续输出被截断;该孙进程也无从管理,直到宿主退出。复现:
实际结果:命令结果被拖慢 graceMs,孙进程在宽限期后的输出丢失。
建议:对 inherited 管道区分「宿主输出」与「孙进程尾巴」:settle 后保留流读空而非 destroy,或明确告知用户孙进程输出不受保证。
问题 3:[低] Windows 下 spill 文件权限位不生效,落共享 %TEMP%
位置:
spawn.ts:89-92,169(mkdtempSync0700 与openSync('wx', 0o600))现象:Windows 无 POSIX 权限语义,0700/0600 不强制。输出超过
maxOutputBytes时的 spill 文件落在共享%TEMP%\dsh-subprocess-*下,同机其他本地用户可读取含命令输出的 .log。复现:Windows 上运行一条输出超过
maxOutputBytes的命令,检查%TEMP%下 spill 文件 ACL。实际结果:敏感命令输出对同机其他用户可读。
建议:Windows 下对 spill 目录显式设置 ACL(仅当前用户),或改落到用户专属目录。
问题 4:[低] 持久 bash 工具层与内部超时错位(300s vs 30s)
位置:
packages/shell/tool-bash-persistent/src/index.ts:280+packages/terminal/terminal-bash/src/config.ts:57现象:工具层默认超时 300s,但
LocalPtySession.startSend内部timeoutMs默认 30s。静默长命令每 30s 以waitReason:'timeout'settle,循环不检查该 reason 只空转重发,直到 300s 才返回「超时」,用户看到的响应被显著延迟。复现:配置持久 bash 后端,运行一条静默超过 30s 的长命令,观察响应时间。
建议:让内部 settle 的 timeout reason 在循环中生效(提前失败或向上汇报),或对齐两层超时默认值。
问题 5:[低] win32 组合下默认 shellPath 指向 /bin/bash
位置:
packages/terminal/terminal-bash/src/config.ts:46现象:
shellPath默认/bin/bash是 POSIX 路径。Windows 下若显式加载该后端(或配置backendType:'shell')将无法 spawn。复现:win32 上用 shell 后端跑任意命令。
建议:按平台提供默认 shellPath 或启动时校验。
环境
dsh 0.1.0-rc(源码
pnpm dsh web),deepseek-v4-flash via deepseek-official,Windows 11。All reactions