Codex 窗口已经消失,任务管理器里却还挂着一组进程;或者再次启动只剩后台进程、没有可用窗口——这时先别按数量判断“正常不正常”。先确认当前任务、集成终端、Codex Scheduled 运行或 Computer Use 会话是否还在拥有这段工作。只要有明确所有者,就回到对应界面停止或完成它,不要直接结束整个进程树。
如果确认没有所有者,先保存提示词、补丁和终端输出,再从 Codex 正常退出,等 CPU 与磁盘活动稳定后复查窗口、父子进程关系和资源变化。只有三种情况值得考虑结束剩余进程树:它已经成为空闲残留;没有所有者却持续活动;或它阻止 Codex 重新打开可用窗口。之后只重新打开一次;同样症状再次出现,就停止反复强退,改为整理版本、环境、复现步骤和脱敏证据。
| 你现在看到的现象 | 先查谁在拥有工作 | 立即动作 | 怎样才算验证完成 |
|---|---|---|---|
| 任务或集成终端还在跑 | 当前任务、终端命令或待确认操作 | 保留进程,回到对应界面停止或完成 | 任务结束后活动自然回落,补丁和输出已保存 |
| Codex Scheduled 运行在后台执行 | Scheduled 运行记录与对应本地项目 | 从 Codex 的 Scheduled 界面管理,不把它当成 Windows 任务计划程序 | 运行状态结束,对应项目不再产生新活动 |
| 正常退出后进程树还在 | 先确认已无任务、终端、Scheduled 或 Computer Use 所有者 | 等活动稳定,复查父子关系与资源变化 | 空闲残留、无所有者持续活动或阻止重开三者之一成立时,才进入结束边界 |
| 再次启动只出现后台进程,没有窗口 | 旧进程树是否阻止新窗口建立 | 保存现场,正常退出;若仍无窗口且无所有者,再结束合格的残留树 | 只重新打开一次;窗口可用或已收集完复发证据 |
| 没有可见任务,CPU 或磁盘却持续活跃 | 再查终端、Scheduled、Computer Use 与正在写入的任务 | 做前后两次观察,不用单次刷新下结论 | 活动在无所有者状态下仍继续,或验证出它阻止重开 |
| node、cmd、PowerShell 或其他 shell 子进程看起来像孤儿 | 父子 PID、启动时间、当前任务与终端归属 | 先查关系和活动,不按进程名批量结束 | 能说明该树确实无所有者,且满足三条结束边界之一 |
先判断这组进程有没有“主人”

OpenAI 没有公布一个适用于所有 Windows 电脑的“Codex 正常进程数”。同一台电脑上,进程树也会随任务、集成终端、Git 操作、语言运行时、浏览器工具、Scheduled 运行、Computer Use、应用版本以及 Windows/WSL2 模式变化。所以,“进程多”只是一个需要继续问的现象,不是故障结论。
更稳的判断有三个维度:
- **所有权:**哪个任务、终端、Scheduled 运行或 Computer Use 会话启动了它?
- **活动度:**输出、文件、CPU 或磁盘活动还在合理前进,还是在没有工作时持续不退?
- **退出后状态:**它是正在收尾,还是在明确退出后仍留下、阻止下一次正常启动?
一段程序在窗口关闭后短暂使用 CPU 或磁盘,可能只是保存文件、终止 shell、结束 Git 操作、写入索引或清理临时状态。任务管理器的一次刷新无法分辨收尾与无限残留。你需要的是停止所有工作前后的对照,而不是一个来自别人电脑的数字。
六种现象看起来很像,处理方式却不同

不要跳过症状分流直接寻找“该杀哪个 exe”。Windows 里的 PowerShell、pwsh、conhost、Node、Git、Python 和 WSL 都是共用工具;它们可能属于 Codex,也可能属于 IDE、另一个终端、开发服务器或其他自动化。
任务或终端还在工作:保留,先从界面停止
如果 Codex 还在生成代码、运行测试、等待审批或持续输出终端内容,那些 helper 进程就有明确所有者。结束整棵树会中断命令,还可能让尚未保存的补丁、部分文件操作或外部服务调用失去上下文。
回到当前任务或终端,选择让它完成,或在该界面取消。之后要看到一个终态:已完成、已取消、已失败或已停止。只有 UI 上不再滚动,不能自动等同于终端命令已经结束。
Codex Scheduled 运行:去 Scheduled 界面管理
截至 2026-07-16,OpenAI 的 Scheduled 任务说明 明确写到:面向本地项目的运行会在后台执行,同时要求电脑保持开机、桌面应用保持运行。因此,即使没有人正盯着前台任务,一棵 Codex 进程树也可能是有意后台工作。
打开 Codex 里的 Scheduled,核对运行名称、上次运行、下次运行,以及它使用本地 checkout 还是 worktree。如果不再需要,从 Scheduled 界面停止或禁用。只在任务管理器中杀掉进程,不会改变启动它的计划。这里说的 Codex Scheduled 也不是 Windows “任务计划程序”的同义词。
退出后还留着:先给收尾一个机会
关闭一个窗口与整个应用完成退出,不一定是同一个生命周期事件。如果你已经明确让 Codex 退出,也确认不再有任务、终端、Scheduled 或 Computer Use 工作,剩余树才进入“可能残留”范围。
这时仍不要用固定秒数做切割。先看父子数量是否收缩、资源活动是否稳定、文件写入是否结束。“还没有消失”不能单独证明泄漏;“无所有者且长期不收尾”才值得升级处理。
启动后只有后台进程:不要连续点应用图标
无窗口时反复启动,会让旧树、新树和你之后的恢复动作缠在一起。先记下已有树的启动时间,确认能否从任务、通知或终端中找回仍需保留的工作,然后只做一次干净恢复。
恢复后只打开一次 Codex。如果窗口出现,检查是否只回到一个连贯任务状态;如果仍然没有可用窗口,不要继续“强退—重开”循环。记下版本、环境、旧树启动时间和你实际点击的顺序,这比第三次重开更有价值。
没有任务却持续占用 CPU 或磁盘:先做前后对照
“空闲”不是看不见输出,而是你已经确认任务、终端命令、Scheduled 运行与 Computer Use 会话都不应继续工作。在任务管理器中先记一次 CPU、磁盘和内存状态,然后停止所有工作、正常退出,再看一次。
短暂峰值可能是索引、终端关闭、Git 工作或文件写入。要升级到结束进程树,需要满足“无所有者”与“活动仍持续”两个条件,或者它已经阻止可用窗口重开。不要把某个 issue 里的 CPU、内存或进程数折算成你的阈值。
shell 子进程像孤儿:查父进程和启动时间
PowerShell、pwsh、conhost.exe、Node、Git、Python 或 WSL 并不因为出现在 Codex 附近就必然属于 Codex。任务管理器的树形显示、PID、父 PID 和启动时间,才能帮你将它们与当前任务或终端对上。
先停止你知道的所有者,观察哪一支随之结束。如果你正在 IDE 里跑 dev server,另一个 PowerShell 窗口也在跑测试,那么按名称杀掉所有 Node 或 PowerShell 很可能会伤及无关工作。目标是终止一支已验证无主的 Codex 树,不是清空开发机上所有 shell。
按八步顺序安全退出,解决后就停手

这条顺序的价值不在于“更温和”,而在于每一步都会缩小问题范围。哪一步恢复了窗口或让活动正常回落,就在那里停止,不要把后续破坏性动作当成例行清理。
- **保存工作。**复制尚未发送的提示词,保存需要的终端输出,确认重要文件和补丁已落盘。如果任务仍在产生改动,明确选择让它完成还是从 Codex 取消。
- **停止所有者。**取消活跃任务,停止你启动的终端命令,禁用不再需要的 Scheduled 运行,或结束当前 Computer Use 会话。
- **正常退出。**只要界面还能响应,就使用应用的正常退出路径。不要从可响应的 UI 直接跳到强制结束。
- **等活动稳定。**给终端子进程、文件写入和清理动作完成的时间。没有一个对所有项目、机器和版本都正确的等待秒数。
- **做前后验证。**看窗口是否已经消失,进程树是否收缩或完全结束,CPU/磁盘活动是否停止,以及是否仍有已确认的所有者。
- **只结束合格的残留树。**在没有所有工作后,剩余树必须是空闲残留、在无所有者时仍持续活动,或者阻止重新打开可用窗口,才可进入这一步。
- **只重新打开一次。**确认是否回到一个可用窗口与一个连贯任务状态,避免制造多棵新树。
- **复发就报告。**同样状态返回后,在重装、删状态或同时改多个设置前,保留版本、环境、时间和前后活动证据。
在任务管理器中,更安全的手工路线是找到顶层 Codex 所属组,再次确认没有仍在进行的工作,只在第 6 步使用 结束任务。如果 UI 无法结束一棵已验证的残留树,管理员可以使用 Windows 的树形结束选项:
powershelltaskkill /PID <top-level-codex-pid> /T /F
/T 会包含子进程,/F 会强制终止。这正是它能恢复残留树、也能破坏正在进行工作的原因。不要粘贴猜测的 PID,不要用共用 shell 名称代替 PID,也不要在保存工作和追踪父子关系之前运行。
用任务管理器做一次前后对照
任务管理器最适合先回答三个问题:这组 Codex 进程是否还在变化?哪个子进程展示了 CPU、磁盘或内存活动?当所有任务、终端或 Scheduled 运行停止后,这些活动是否随之改变?
可以这样做:
- 在 进程 视图展开 Codex 分组,同时看 CPU、内存和磁盘列。
- 记录当时是否有任务、终端、Scheduled 或 Computer Use 正在工作,以及当前时间。
- 从所有界面停止这段工作,正常退出 Codex,等活动开始稳定。
- 再看同一组列,记下是完全退出、树形收缩,还是无所有者时仍持续活跃。
- 需要 PID 和更清楚的父子对照时打开 详细信息 视图;需要查哪个文件仍在被读写时,再用资源监视器补充。
记录前后对照时,分开“活动变化”和“绝对数字”。内存使用没有立即归零不一定是故障;某一秒 CPU 上升也不一定是死循环。更能说明问题的是:无任务状态能否稳定重现,正常退出后树是否仍存在,以及该树是否与无窗口启动或持续活动同时出现。
用 PowerShell 还原父子关系,不靠名字猜
先用低隐私风险的快照,不要一上来就导出命令行。下面的 CIM 查询保留进程名、PID、父 PID 和创建时间:
powershellGet-CimInstance Win32_Process | Where-Object { $_.Name -match 'codex|powershell|pwsh|conhost|node|git|python|wsl' } | Sort-Object ParentProcessId, ProcessId | Select-Object Name, ProcessId, ParentProcessId, CreationDate
这个正则只是观察辅助,不是 Codex 进程的官方定义。它会把无关的开发工具一起选出,也可能漏掉名称不在列表里的辅助进程。正确用法是根据父 PID 和启动时间重建关系,再与 Codex 任务、终端和当时的操作时间对照,而不是将查询结果全部作为结束对象。
如果要保存一份轻量资源快照,可以运行:
powershellGet-Process | Where-Object { $_.ProcessName -match 'codex|powershell|pwsh|conhost|node|git|python|wsl' } | Sort-Object CPU -Descending | Select-Object ProcessName, Id, @{Name='CPUSeconds'; Expression={[math]::Round($_.CPU, 1)}}, @{Name='MemoryMB'; Expression={[math]::Round($_.WorkingSet64 / 1MB, 1)}}
这里的 CPUSeconds 是进程到当前为止的累计 CPU 时间,不是任务管理器里随时变化的即时 CPU 百分比。运行两次快照,观察累计值是否继续增加,再和任务管理器里的实时 CPU、磁盘列对照,才更容易判断活动是否仍在推进。MemoryMB 也只是工作集快照,不是“超过多少就异常”的阈值。
如果查询某个进程时遇到权限拒绝,把“无法读取”本身记进报告,不要只为了得到一张更漂亮的表就贸然提高权限。也不要默认公开 CommandLine 字段:命令行里可能包含仓库路径、分支名、提示词、文件名、访问令牌、客户信息或其他秘密。
把 Windows 原生 agent、WSL2 agent 与集成终端分开
截至 2026-07-16,OpenAI 当前的 ChatGPT 桌面应用 Windows 文档 将两种 agent 环境分开:一种在 Windows 原生环境中使用 PowerShell 与 Windows sandbox,另一种让 agent 在 WSL2 中运行。文档还把集成终端选项当成独立设置;选择哪种交互 shell,不自动等于 agent 就运行在哪个环境里。把 agent 环境切到 WSL 需要重启应用。
| 你正在使用的环境 | 可能看到的子进程 | 需要确认的事实 | 不要据此推断 |
|---|---|---|---|
| Windows 原生 agent | PowerShell、console host、Git、Node、Python 与项目工具 | 哪个 Codex 任务或终端启动了它们 | 看到 PowerShell 或 Node 就一定是残留 |
| WSL2 agent | Windows 侧 WSL host,加上 Linux shell 与项目工具 | 当前 agent 是否在 WSL2、使用哪个发行版与哪类项目路径 | 看到 WSL 就能证明 agent 卡死 |
| 集成终端选项 | 为交互终端选择的 shell | 这是不是你在 Codex 里主动打开并仍在运行的终端 | 终端 shell 选择等同于 agent 环境 |
不要把切换 Windows/WSL2 当成第一次恢复动作。切换会改变实验条件,并要求应用重启;如果你在记录失败前就同时换 agent 环境、终端、项目路径和权限,之后即使恢复,也很难知道真正改变了什么。更好的顺序是先保存当前失败状态和基线,只在问题可复现后一次改变一个变量。
如果进程树已经健康,真正的问题仍是桌面应用比 CLI 或 IDE 明显慢,请转到独立的 Codex Windows 应用与 CLI 路径检查。那篇文章负责跨入口的同一提示基准;本文只负责后台进程的所有权、生命周期与安全恢复。
Scheduled 与 Computer Use 都可能拥有后台工作
两类工作最容易被误判为“Codex 明明空闲却还在跑”:一类是 Scheduled 本地运行,另一类是 Computer Use 正在控制浏览器或其他 GUI。判断方法不是看前台有没有聊天文字,而是去拥有这段工作的界面确认当前状态。
Scheduled:进程结束不代表计划已经关闭
Scheduled 本地运行需要电脑开机、桌面应用运行;它还可能使用本地 checkout 或隔离 worktree。你应该记录是哪一个计划、最近和下一次运行时间、项目位置类型,以及停止或禁用后是否还会产生新的本地活动。直接结束一次进程树最多中断这次运行,不会自动关闭未来计划。
Computer Use:先结束会话,再观察相关活动是否停止
Computer Use 会故意让应用与浏览器工作持续一段时间。结束 Codex 树以前,先确认是不是仍有会话在运行;能够从所有界面结束时,就先在该界面结束,再验证浏览器和相关进程活动是否随之停止。
如果你的问题是如何启动、授权或监督 GUI 工作,而不是退出后为何仍有残留,请看 Codex Computer Use 中文指南。这两个主题的交集只有一个:Computer Use 是可能的任务所有者,不是看到后台进程就能推定的故障原因。
复发时,交付一份能被别人复现的报告

一次强制结束也许能恢复窗口,但它没有解释为什么会复发。真正有用的报告会把应用版本、Windows 环境、当时有没有所有者、退出前后资源变化、复现步骤和恢复结果连在一起。这样,维护者才能区分一次性的任务收尾、Scheduled 或 Computer Use 所有权、某个环境组合的问题,以及可重复的生命周期故障。
OpenAI 当前的 反馈与日志说明 将 Codex 问题引导到已有 GitHub issue 或新 issue,并提醒分享日志或会话记录前检查敏感信息。文档给出的会话记录位置是 $CODEX_HOME/sessions,但没有提供一条适用于所有 Windows 安装的通用应用日志路径。因此,不要从旧帖子中猜一个“官方日志目录”,也不要为了补齐报告而公开整个 session 目录。
在重装、删除状态或大范围改配置前,至少保存这些信息:
- Codex 应用版本、本地观察日期与时间
- Windows 版本、系统架构
- agent 环境:Windows 原生/PowerShell 还是 WSL2
- 与问题有关时,记录集成终端选择
- 项目类型,以及运行使用本地 checkout 还是 worktree
- Tasks、Scheduled、终端或 Computer Use 当时是否显示活动
- 可见症状:正常退出后残留、启动后无窗口,还是无所有者时持续高活动
- 顶层和子进程 PID、父 PID、启动时间
- 正常退出前后的 CPU、磁盘、内存观察
- 最小复现步骤,以及一次干净重开能否恢复
可以按下面的短模板提交:
textCodex 应用版本: Windows 版本: Agent 环境:Windows 原生 / WSL2 集成终端选择: 项目类型与路径类型:[必要时脱敏] 当时是否有所有者工作:任务 / Scheduled / 终端 / Computer Use / 无 可见症状: 最小复现步骤: 期望结果: 实际结果: 退出前后 CPU、磁盘、内存变化: 正常退出是否清除了进程树: 一次干净重开是否恢复:
公开前要删掉或替换提示词和 transcript 内容、token、客户数据、私有仓库名、用户名、完整本地路径与敏感命令行参数。PID 和版本可以帮助复现,但也要与具体时间、环境和行为绑定;它们只描述这一台机器的一次案例,不能升级为所有人的正常或异常标准。
这些“快捷修复”会让问题更难判断
按固定进程数判定异常
进程树随任务、工具、环境与应用版本变化。固定数量既可能误杀有所有者的工作,也可能放过数量少但无窗口、持续活动的残留树。用所有权、活动度和退出后状态替代数量阈值。
按名字结束所有 Node、PowerShell、Git、Python 或 WSL
这些工具在开发机上由多个程序共享。即使某个子进程确实由 Codex 启动,也应先确认父子关系,再结束顶层、已验证无主的 Codex 分支;不要让无关的 IDE、dev server 或终端一起退出。
一开始就删缓存、session 或 .codex 状态
这样可能同时丢失证据和配置,却无法回答“正常退出是否能清除这棵树”。先走可逆的所有者停止、正常退出与前后验证。只有在证据已经保存、官方支持或明确复现步骤要求时,才讨论更深的状态清理。
先重装,再考虑怎么复现
重装会改变应用文件、版本和部分本地状态。它可能暂时掩盖症状,也可能消掉最有价值的前后对照。一次恢复失败后先整理报告;不要把重装当成第一条诊断命令。
同时换 WSL 模式、终端、权限和项目位置
一次改变四个变量,即使恢复也不能告诉你是哪一个变量有效。保留基线,每次只改一项,并记录变化前后是否仍能复现。
反复强退、反复启动
一次有界恢复已经足够判断问题是否复发。继续循环只会制造更多树、更多时间线和更多丢失工作风险。第二次出现相同状态时,正确下一步是报告,不是再重复同一组破坏性动作。
常见问题
Windows 上正常会有几个 Codex 进程?
没有官方公布的通用数量。活动任务、集成终端、Git 与语言工具、Scheduled、Computer Use、Windows/WSL2 模式和应用版本都会改变进程树。先判断谁在拥有工作、退出后是否收尾,以及无所有者时活动是否仍持续。
在任务管理器里结束 Codex 安全吗?
只有在你已经保存工作、停止任务所有者、尝试正常退出、等活动稳定并验证剩余树满足三条边界之一时,才是合理的恢复动作。这三条边界是:空闲残留;无所有者却持续活动;或阻止 Codex 重新打开可用窗口。更早强退可能中断终端、补丁、文件写入或外部工具。
为什么关掉 Codex 窗口后进程还在?
任务、集成终端、Codex Scheduled 运行或 Computer Use 会话可能仍在拥有后台工作,应用也可能正在做收尾。确认没有任何所有者并完成一次正常退出后,如果树仍不结束、持续活动或阻止重开,才按残留生命周期问题处理。
任务管理器里有 Codex,但窗口打不开怎么办?
不要连续点击应用图标。先记录已有树的启动时间,保存能够找回的工作,按八步顺序完成一次干净恢复,然后只重开一次。仍无可用窗口时,保存版本、环境、父子关系、资源变化和准确点击顺序,转入报告。
CPU 或磁盘很高就能证明 Codex 卡住了吗?
不能。短暂活动可能来自 agent 任务、终端命令、Git、索引、Scheduled 运行或退出收尾。只有在你确认没有所有者、活动仍持续,并通过退出前后对照把它与剩余 Codex 树联系起来时,这个信号才足以推动有界结束或上报。
background_terminal_max_timeout 能减少 Windows 后台进程吗?
不能。当前 Codex 配置参考 将它定义为后台终端输出的最长轮询窗口;它不是进程数量设置,也不是桌面应用残留树的一线修复项。只有在你诊断长时间后台终端轮询时,这个配置才可能与问题相关。
看到 node、cmd、PowerShell 或 WSL 子进程可以全部结束吗?
不可以按名字批量处理。先用父 PID、启动时间和当前任务还原归属,再停止所有者。只有顶层、已验证无主的 Codex 分支满足结束边界时,才结束那一支,并保留其他开发工作。
切换到 WSL2 会修好后台进程问题吗?
不应把它当成第一次恢复。Windows 原生 agent、WSL2 agent 与集成终端是不同维度,切换 agent 环境还要求重启应用。先保存失败基线,问题可复现后再一次只改变一个环境变量,才能知道切换是否真的有关。
报告时要上传哪个 Windows 日志目录?
当前官方说明给出了 $CODEX_HOME/sessions 作为会话记录位置,却没有给出一个适用于所有 Windows 安装的通用应用日志路径。优先提交版本、环境、所有权、父子 PID、前后资源变化与最小复现步骤;任何 session、日志或截图都要先脱敏,不要公开整个目录。
最后只记住一条处理规则
有任务、终端、Scheduled 运行或 Computer Use 会话拥有工作时,就保留 Codex 后台进程,并从拥有它的界面停止。没有所有者时,严格按“保存工作、停止所有者、正常退出、等活动稳定、前后验证、只结束合格残留树、只重开一次、复发就报告”的顺序处理。
这条规则既能解决眼前的无窗口、退出后残留或无主高活动,也能保留真正修复复发问题所需的证据。进程列表只是观察入口;所有权、活动度与生命周期才是结论。