最近我遇到了一个 Windows 版 Codex 的启动问题:

Codex 更新之后,点击图标没有任何反应,但任务管理器里能看到 ChatGPT.exe 进程存在。程序既不会出现在托盘,也不会显示主窗口。

更奇怪的是,反复杀掉进程、重新启动也没有用,但放着不管十几分钟甚至一个小时之后,它偶尔又会自己恢复。

经过排查,我这边最终发现其实有两层问题,其中真正导致 Codex 无法启动的是 cua_node runtime 在更新后的复制过程失败。

下面记录完整排查和修复过程。


一、问题表现

典型症状:

  • Codex 更新之后无法打开;

  • 任务管理器中存在 ChatGPT.exe

  • 没有 Codex 主窗口;

  • 没有托盘图标;

  • 杀掉进程重新启动仍然无效;

  • 等待一段时间之后,有时会突然自己恢复;

  • 下一次更新之后又可能再次出现。

如果你遇到的情况基本一致,可以继续往下排查。


二、先检查 Codex 本体是否正常

推荐使用 Windows 自带的 PowerShell 5.1。

按:

Win + R

输入:

powershell.exe

然后执行:

Get-AppxPackage -Name OpenAI.Codex |
    Select Name, Version, Status, PackageFullName, InstallLocation

我的结果类似:

Name    : OpenAI.Codex
Version : 26.901.2854.0
Status  : Ok

如果:

Status : Ok

说明 MSIX / Microsoft Store 安装包本身基本正常。

如果出现:

NeedsRemediation

或者其他异常状态,那么可能属于包注册损坏问题,需要优先考虑 Windows 的应用修复或重新安装。


三、检查是不是“进程存在,但没有主窗口”

运行:

Get-Process ChatGPT -ErrorAction SilentlyContinue |
    Select Id, ProcessName, Responding, MainWindowHandle, MainWindowTitle, Path

如果看到类似:

Responding       : True
MainWindowHandle : 0
MainWindowTitle  :

那么说明:

Codex 并不是完全没有启动。

ChatGPT.exe 已经运行了,只是 Electron 主窗口根本没有成功创建。

这个现象非常重要,因为它可以把问题从“Windows 没启动程序”进一步缩小到“Codex 初始化过程中卡住”。


四、第一层问题:Codex 内置 updater 卡住

部分 Windows Codex 更新后,会卡在 Codex 自己的 in-app updater / Sparkle 更新逻辑上。

可以尝试关闭 Codex 内置 updater,让 Microsoft Store 负责更新。

执行:

[Environment]::SetEnvironmentVariable(
    "CODEX_SPARKLE_ENABLED",
    "false",
    "User"
)

验证:

[Environment]::GetEnvironmentVariable(
    "CODEX_SPARKLE_ENABLED",
    "User"
)

如果返回:

false

说明环境变量设置成功。

建议设置完成之后注销 Windows 或重启电脑一次。

这一步可以解决一部分“更新后需要等几分钟才启动”的问题。

但我自己的机器设置完这个变量之后,Codex 仍然无法打开。

于是继续排查。


五、真正的问题:cua_node runtime staging 失败

Codex Windows 版会把自带的一套 Node runtime 从:

C:\Program Files\WindowsApps\...

复制到:

%LOCALAPPDATA%\OpenAI\Codex\runtimes\cua_node

更新之后,Codex 会建立新的 runtime。

如果这个复制过程失败,就会出现大量类似目录:

.staging-xxxxxxxxxxxxxxxx-xxxxxx

但始终无法生成最终的完整 runtime。

可以执行下面的命令检查:

$root = "$env:LOCALAPPDATA\OpenAI\Codex\runtimes\cua_node"

Get-ChildItem $root -Directory -Force -ErrorAction SilentlyContinue |
    Sort-Object LastWriteTime -Descending |
    Select-Object -First 10 |
    ForEach-Object {
        [PSCustomObject]@{
            Name     = $_.Name
            NodeExe  = Test-Path "$($_.FullName)\bin\node.exe"
            NodeRepl = Test-Path "$($_.FullName)\bin\node_repl.exe"
            Manifest = Test-Path "$($_.FullName)\manifest.json"
        }
    }

我当时得到的结果是:

Name                             NodeExe NodeRepl Manifest
----                             ------- -------- --------
.staging-8e7585fc8f35ed57-rsAX9n    True    False    False
.staging-8e7585fc8f35ed57-rCN2Sp    True    False    False
.staging-8e7585fc8f35ed57-2l7wnh    True    False    False
.staging-8e7585fc8f35ed57-A998JV    True    False    False
...

这里的信息非常关键。

每一次启动都会创建新的:

.staging-8e7585fc8f35ed57-xxxxxx

说明 Codex 一直在尝试创建:

8e7585fc8f35ed57

这个 runtime。

但是每次结果都是:

node.exe      = True
node_repl.exe = False
manifest.json = False

也就是说,复制永远进行到一半就失败。

因此 Codex 每次启动过程实际上是:

启动 Codex
↓
发现新的 cua_node runtime 不存在
↓
创建 .staging-* 临时目录
↓
从 WindowsApps 复制 runtime
↓
部分文件复制失败
↓
staging 无法 finalize
↓
renderer / app-server 无法继续初始化
↓
ChatGPT.exe 进程存在
↓
但主窗口始终不出现

这也解释了为什么疯狂地:

杀进程 → 重启 → 杀进程 → 重启

完全没有效果。

每次重启只是又多制造一个新的 .staging-*


六、修复方法

核心方法非常简单:

不要让 Codex 自己复制。

手动把 Microsoft Store 安装包里的 cua_node runtime 完整复制到正确的 runtime 目录。

关键在于使用:

xcopy /G

第一步:关闭 Codex

Get-Process ChatGPT -ErrorAction SilentlyContinue |
    Stop-Process -Force

第二步:找到当前 Codex 安装目录

$pkg = Get-AppxPackage OpenAI.Codex

源 runtime 位于:

$src = Join-Path $pkg.InstallLocation "app\resources\cua_node"

可以查看:

$src

例如:

C:\Program Files\WindowsApps\OpenAI.Codex_26.901.2854.0_x64__2p2nqsd0c76g0\app\resources\cua_node

第三步:确定 runtime ID

从前面的 .staging-* 目录名中可以看出来。

例如:

.staging-8e7585fc8f35ed57-rsAX9n
.staging-8e7585fc8f35ed57-rCN2Sp

那么 runtime ID 就是:

8e7585fc8f35ed57

注意:

这个值会随着 Codex 版本发生变化。

不要直接照抄我的 ID。

应该使用你自己机器上 .staging-* 中对应的 ID。


第四步:创建最终 runtime 目录

假设 runtime ID 是:

8e7585fc8f35ed57

执行:

$dst = "$env:LOCALAPPDATA\OpenAI\Codex\runtimes\cua_node\8e7585fc8f35ed57"

New-Item -ItemType Directory -Force -Path $dst |
    Out-Null

第五步:使用 xcopy /G 完整复制

执行:

& xcopy.exe "$src\*" "$dst\" /E /I /H /Y /G

参数含义大致如下:

/E   复制所有子目录
/I   将目标视为目录
/H   包括隐藏和系统文件
/Y   覆盖时不询问
/G   允许将加密/受保护来源复制成普通目标文件

这里最关键的就是:

/G

我的机器最终显示:

复制了 4683 个文件

说明整个 runtime 已经被完整复制过去。


七、验证修复是否成功

执行:

$dst = "$env:LOCALAPPDATA\OpenAI\Codex\runtimes\cua_node\8e7585fc8f35ed57"

[PSCustomObject]@{
    NodeExe  = Test-Path "$dst\bin\node.exe"
    NodeRepl = Test-Path "$dst\bin\node_repl.exe"
    Manifest = Test-Path "$dst\manifest.json"
}

正常应该看到:

NodeExe NodeRepl Manifest
------- -------- --------
True    True     True

我的机器修复之前是:

True False False

修复以后变成:

True True True

随后 Codex 立即恢复正常启动。


八、启动 Codex

可以直接从开始菜单正常启动。

如果希望从 PowerShell 启动,可以使用:

$env:CODEX_SPARKLE_ENABLED = "false"

$pkg = Get-AppxPackage OpenAI.Codex

$exe = Join-Path $pkg.InstallLocation "app\ChatGPT.exe"

Invoke-CommandInDesktopPackage `
    -PackageFamilyName $pkg.PackageFamilyName `
    -AppId "App" `
    -Command $exe

如果前面的 runtime 已经完整,这时 Codex 应该可以正常创建窗口。


九、整个问题的逻辑

我最终遇到的情况可以总结成两层:

Codex 更新后打不开
│
├─ 第一层:Codex 内置 updater / Sparkle
│
│  CODEX_SPARKLE_ENABLED=false
│
│  ↓
│
│  绕过内置更新逻辑
│
└─ 第二层:cua_node runtime relocation 失败
   │
   ├─ 出现大量 .staging-* 目录
   ├─ node.exe 存在
   ├─ node_repl.exe 缺失
   └─ manifest.json 缺失
       ↓
   使用 xcopy /G 手动复制完整 runtime
       ↓
   NodeExe=True
   NodeRepl=True
   Manifest=True
       ↓
   Codex 恢复正常启动

十、几个需要注意的地方

第一,不建议一上来就删除整个:

%LOCALAPPDATA%\OpenAI\Codex

因为问题并不一定来自用户配置。

第二,不建议修改:

C:\Program Files\WindowsApps

的所有权或者 ACL 权限。

修复过程中完全不需要这么做。

第三,不建议反复重装 Codex。

如果 MSIX:

Status = Ok

而同时又出现大量不完整 .staging-*,重装很可能只是暂时恢复,下一次版本更新还可能重新遇到。

第四,runtime ID 每个版本可能不同。

例如我的:

8e7585fc8f35ed57

只能作为示例。

必须从自己机器上的:

.staging-<runtime-id>-<random>

中提取真正的 runtime ID。

第五,如果只是设置:

CODEX_SPARKLE_ENABLED=false

之后仍然打不开,不代表这个变量没有生效。

它解决的是 updater 问题。

如果 cua_node 已经发生 staging 失败,还需要单独修复 runtime。


最后总结

如果你的 Windows Codex 更新后出现:

任务管理器有 ChatGPT.exe
但没有任何窗口

可以优先检查:

%LOCALAPPDATA%\OpenAI\Codex\runtimes\cua_node

如果里面出现大量:

.staging-xxxxxxxxxxxxxxxx-xxxxxx

并且:

node.exe      = True
node_repl.exe = False
manifest.json = False

那么很可能就是 cua_node runtime 复制失败。

使用:

xcopy /G

把 Codex 安装包内的完整 cua_node 手动复制到对应 runtime ID 目录,在我的机器上成功解决了这个问题。

修复前:

True False False

修复后:

True True True

Codex 随即恢复正常启动。

如果以后 Codex 再次更新并重新出现同样问题,需要重新检查新的 .staging-* 对应的 runtime ID,因为新的版本可能会使用新的 runtime hash。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐