Skip to content

fix(cli): Windows 守护进程外壳改用 cmd 重定向输出 - #165

Merged
Tanya7z merged 1 commit into
mainfrom
fix/daemon-host-cmd-redirect
Oct 27, 2026
Merged

Tanya7z merged 1 commit into
mainfrom
fix/daemon-host-cmd-redirect

Conversation

@Tanya7z

@Tanya7z Tanya7z commented Oct 27, 2026

Copy link
Copy Markdown
Member

问题

10/27 11:29 dogelake 整个实例(BDS、db、qq、bluemap)无预兆停服,桌面端提示"游戏服务器数据服务暂不可用"。

服务器崩溃报告显示 11:29:39、11:29:50 两次 powershell.exe 崩溃,签名为 PSInvalidOperation @ ScriptBlock.GetContextFromTLS。原因是 launchWindowsOutsideSession 的外壳脚本用 PowerShell 脚本块注册 OutputDataReceived / ErrorDataReceived:Windows PowerShell 5.1 中这些回调运行在没有 Runspace 的线程池线程上,守护进程一输出就让外壳崩溃,守护进程及其服务随之退出。daemon.log 自 10/15 后再无写入,也印证了这一点。

修改

  • 外壳改为启动 cmd.exe /d /s /c "... --daemon >> daemon.log 2>&1",不再在 PowerShell 中接管输出。
  • 路径通过环境变量交给 cmd 展开,避免引号或特殊字符截断;保留"不把 SFMC_DAEMON_LOG 留给守护进程"的原逻辑。

验证

本机经 WMI 实际拉起假守护进程(路径含空格与 &),标准输出和标准错误各 20 行:

  • 无 PowerShell 崩溃报告,42 行全部写入日志。
  • 守护进程环境中没有 SFMC_DAEMON_LOG。
  • 运行期间读取日志全部成功。追加打开会返回 EBUSY,守护进程退出后立即释放。平台切换中的 waitDaemonLogAppendable 发生在旧守护进程退出之后,不受影响。
  • pnpm run typecheck 通过。

Windows PowerShell 5.1 中 OutputDataReceived 脚本块回调运行在没有 Runspace 的线程池线程上,守护进程第一次输出就会抛 PSInvalidOperationException 使外壳崩溃,守护进程及其服务随之退出。改由 cmd.exe 把输出追加到 daemon.log。
@Tanya7z
Tanya7z merged commit 91e1eb5 into main Oct 27, 2026
4 checks passed
@Tanya7z
Tanya7z deleted the fix/daemon-host-cmd-redirect branch October 27, 2026 05:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant