Codex 在 Windows 上弹出 Node 和 PowerShell 窗口,原因找到了
原创 · 约 9 分钟阅读 · 阅读 --

Codex 在 Windows 上弹出 Node 和 PowerShell 窗口,原因找到了

作者: Alex Xiang


我是 Alex Xiang,前百度/微博工程师,现在专注于 AI 工程与工具产品。更多文章欢迎关注微信公众号「字与码」。

Codex 启动后,桌面上多出几个标题为 node、node_repl 的窗口。把它们隐藏后,任务运行到一半又会冒出 pwsh。几天前还没有这个现象,难免怀疑是 Node 或 PowerShell 更新出了问题。

这次排查发现,问题的共同点不是这些工具本身,而是启动它们的父进程:Codex 的共享后台服务。本机运行的是 Codex 0.157.0;公开的 Codex 问题报告也记录了同一类 Windows 弹窗,并指出了对应的进程启动代码。

先看窗口是谁启动的

在 Windows 上,窗口标题只能告诉我们正在运行什么程序,不能告诉我们是谁启动了它。查看进程的父进程后,情况就清楚了:

codex.exe app-server --managed-daemon
├─ node_repl.exe          浏览器、电脑操作等后台工具
├─ node.exe               插件服务
└─ pwsh.exe               任务中的 PowerShell 命令

本机实际出现的 pwsh.exe,父进程是同一个 Codex 后台服务;它执行的命令就是当时任务里的 PowerShell 命令。与此同时,手动打开的 PowerShell 属于 WindowsTerminal.exe,父进程不同。这也解释了为什么只按程序名隐藏窗口会误伤自己的终端。

可以用下面的只读命令检查自己机器上的进程关系:

$processes = Get-CimInstance Win32_Process
$processes |
  Where-Object { $_.Name -in @('pwsh.exe', 'node.exe', 'node_repl.exe') } |
  ForEach-Object {
    $parent = $processes | Where-Object ProcessId -eq $_.ParentProcessId
    [pscustomobject]@{
      Name = $_.Name
      PID = $_.ProcessId
      Parent = $parent.Name
      ParentPID = $_.ParentProcessId
    }
  }

只看见 pwsh.exe 并不能判定它是 Codex 弹出的;要看它的父进程。如果父进程是 WindowsTerminal.exe,那通常是自己开的终端标签页。

为什么后台服务会带出可见窗口

Codex 的共享后台服务在 Windows 上以没有控制台的方式运行。它再启动 pwsh.exe、node.exe 这类控制台程序时,如果没有给这次创建进程的操作加上 CREATE_NO_WINDOW 等合适的标志,Windows 就会分配一个新的控制台窗口。任务每执行一条命令,窗口就可能再出现一次。

Codex 的公开问题报告 #44768 已把问题追到源码:后台服务以 DETACHED_PROCESS 启动,而部分命令和 hook 的子进程启动路径没有设置 CREATE_NO_WINDOW。报告还做了对照:停用共享后台服务、让终端版 Codex 使用自身的服务时,弹窗消失。另有 0.157.0 的报告 #48074 描述了安装后台服务后,每次请求反复闪出终端窗口的现象。

这说明两件事。第一,标题是 node 或 pwsh 只是表象,修改这些程序的设置通常抓不住共同原因。第二,把已出现的窗口藏起来,与阻止它被创建,是两种不同的修复。前者可能仍会闪一下;后者需要在 Codex 创建子进程时处理。

当前能怎么处理

如果主要使用终端版 Codex,可以尝试用 codex --no-daemon 启动。当前版本的帮助信息明确支持这个选项,含义是让本次会话不连接共享后台服务。公开问题报告中的对照实验表明,这条路径可以避免它所记录的命令弹窗。它只影响这次终端会话,不能替代桌面版的修复。

对于仍使用共享后台服务的场景,可以用窗口隐藏工具减少干扰,但规则必须同时核对程序名和父进程。本机的临时处理只隐藏由 Codex 后台服务启动的 node.exe、node_repl.exe、pwsh.exe 等窗口,保留 Windows Terminal 中手动打开的终端。实测后台进程继续运行,相关窗口会被隐藏;由于隐藏动作发生在窗口创建之后,短暂闪现仍可能发生。

最终应由 Codex 在相应的 Windows 子进程启动路径上修复窗口标志。不要为了消除弹窗而直接结束不认识的 node 或 pwsh 进程:那可能正是正在运行的任务。

这次排查留下的结论

本机能直接证明的是:弹出的 pwsh 由 Codex 共享后台服务启动,node 和 node_repl 窗口也来自它;本地后台版本为 0.157.0。公开源码分析解释了为什么没有控制台的后台服务会让命令子进程开出可见窗口。至于本机究竟是哪一次更新首次改变了行为,现有记录只能把时间收窄到最近的应用和后台更新,不能精确归因到某一个安装步骤。

参考资料:Codex #44768:后台服务启动命令与 hook 时的 Windows 弹窗;Codex #48074:0.157.0 安装后台服务后反复闪窗;Codex #48023:0.157.0 启动 MCP 服务时的弹窗。

打开原图 ↗