AIGC标识 Ubuntu ChatGPT Desktop App bug:Codex CLI 正常,但本地项目一直 Network Reconnecting 的排查与解决

1. 问题背景

最近在 Ubuntu 上使用 ChatGPT Desktop App 时遇到了一个比较奇怪的问题:

  • ChatGPT App 中普通 ChatGPT 对话正常;
  • ChatGPT App 可以正常连接 SSH 远程项目,并使用 Codex;
  • 本机 codex CLI 可以正常使用;
  • 但是 ChatGPT App 打开本地项目后,Codex 一直显示网络重连(Reconnecting / waiting for network),无法正常对话。

本地项目例如:

~/franka_ros2_ws

与此同时,电脑本身可以正常访问外网。

本机使用代理软件,代理地址为:

HTTP:  127.0.0.1:7890
SOCKS: 127.0.0.1:7890

最终发现:

问题并不在项目、Codex 登录状态或 ~/.codex 配置,而是 Ubuntu 从桌面图标启动 ChatGPT App 时,没有把终端中的代理环境变量传递给 ChatGPT Desktop 内置的 Codex Runtime。


2. 最初的现象

问题最令人困惑的地方在于,不同使用方式表现完全不同:

使用方式 状态
浏览器访问 ChatGPT ✅ 正常
ChatGPT Desktop 普通对话 ✅ 正常
Codex CLI ✅ 正常
ChatGPT Desktop + SSH 项目 ✅ 正常
ChatGPT Desktop + Local 项目 ❌ 一直 Reconnecting

因此一开始很容易怀疑:

  • 本地项目权限;
  • Codex sandbox;
  • ~/.codex/config.toml
  • 之前使用过的 Codex 第三方配置;
  • Codex 登录状态;
  • ChatGPT App 安装损坏。

但这些最终都不是根因。


3. 第一阶段:检查 Codex 配置

首先检查代理:

env | grep -iE 'http_proxy|https_proxy|all_proxy|no_proxy'

终端中可以看到:

https_proxy=http://127.0.0.1:7890/
HTTPS_PROXY=http://127.0.0.1:7890/
HTTP_PROXY=http://127.0.0.1:7890/
http_proxy=http://127.0.0.1:7890/
ALL_PROXY=socks://127.0.0.1:7890/
all_proxy=socks://127.0.0.1:7890/

然后检查是否存在旧的 OpenAI / Codex 环境变量:

env | grep -iE 'openai|codex|chatgpt'

没有发现异常。

继续检查:

grep -nEi \
'provider|base_url|base-url|api|proxy|model|auth|openai|endpoint' \
~/.codex/config.toml

也没有发现第三方 base_url、自定义 provider 等明显异常配置。

因此旧 Codex 配置已经不是最主要的怀疑对象。


4. 第二阶段:彻底重装 Codex

为了彻底排除历史配置污染,直接清理:

rm -rf ~/.codex
rm -rf ~/.cache/codex-runtimes

并重新安装 Codex CLI:

npm uninstall -g @openai/codex
npm install -g @openai/codex@latest

重新登录官方 ChatGPT 账号后:

codex

此时出现了一个非常重要的现象:

Codex CLI 已经可以正常使用,但 ChatGPT Desktop 中的 Local Codex 仍然一直 Reconnecting。

至此基本可以排除:

  • ~/.codex 历史配置;
  • Codex CLI 安装问题;
  • ChatGPT 账号本身;
  • 本地项目本身无法被 Codex 访问。

问题范围开始收敛到:

ChatGPT Desktop 自己启动的 Local Codex Runtime。


5. 关键发现:Desktop 和 CLI 使用的不是同一个 Codex 进程

运行:

ps aux | grep -Ei 'chatgpt|codex' | grep -v grep

发现 CLI Codex 使用的是:

/home/xh/.npm-global/bin/codex

以及:

/home/xh/.npm-global/lib/node_modules/@openai/codex/...

但是 ChatGPT Desktop 启动了另外一个 Codex:

/usr/lib/chatgpt/resources/codex ... app-server

也就是说:

Codex CLI
    ↓
~/.npm-global/.../codex


ChatGPT Desktop
    ↓
/usr/lib/chatgpt/resources/codex

这是两个不同的 Runtime。

因此:

Codex CLI 正常,并不能证明 ChatGPT Desktop 内置 Codex 的网络环境正常。

这是整个排障过程中最关键的转折点。


6. 最终定位:比较两个 Codex 进程的环境变量

接下来直接读取 Linux /proc 中的进程环境。

假设 CLI Codex PID 为 261597

tr '\0' '\n' < /proc/261597/environ | \
grep -iE '^(http_proxy|https_proxy|all_proxy|HTTP_PROXY|HTTPS_PROXY|ALL_PROXY|NO_PROXY|no_proxy)='

结果:

no_proxy=...
https_proxy=http://127.0.0.1:7890/
NO_PROXY=...
HTTPS_PROXY=http://127.0.0.1:7890/
HTTP_PROXY=http://127.0.0.1:7890/
http_proxy=http://127.0.0.1:7890/
ALL_PROXY=socks://127.0.0.1:7890/
all_proxy=socks://127.0.0.1:7890/

CLI Codex 正确继承了代理。

然后检查 ChatGPT Desktop 内置 Codex:

tr '\0' '\n' < /proc/<DESKTOP_CODEX_PID>/environ | \
grep -iE '^(http_proxy|https_proxy|all_proxy|HTTP_PROXY|HTTPS_PROXY|ALL_PROXY|NO_PROXY|no_proxy)='

结果:

<没有任何输出>

再检查 ChatGPT Desktop 主进程:

tr '\0' '\n' < /proc/<CHATGPT_PID>/environ | \
grep -iE '^(http_proxy|https_proxy|all_proxy|HTTP_PROXY|HTTPS_PROXY|ALL_PROXY|NO_PROXY|no_proxy)='

同样:

<没有任何输出>

至此根因基本确定。


7. 根因

终端中的 Codex CLI:

Terminal
    │
    ├── HTTP_PROXY
    ├── HTTPS_PROXY
    └── ALL_PROXY
          │
          ▼
      Codex CLI
          │
          ▼
      Proxy :7890
          │
          ▼
        OpenAI
          │
          └── ✅ 正常

但是从 Ubuntu Desktop Launcher 启动 ChatGPT:

Ubuntu Desktop
      │
      ▼
 ChatGPT App
      │
      │  没有 HTTP_PROXY / HTTPS_PROXY
      ▼
Desktop Codex Runtime
      │
      ▼
   OpenAI
      │
      └── ❌ Reconnecting

也就是说:

Shell 中配置的代理环境变量,并不会自动保证从 Ubuntu 图形桌面启动的应用程序能够继承这些变量。

而 ChatGPT Desktop 内置的 Local Codex Runtime 恰好需要正确的网络代理环境。

这也解释了为什么:

  • 浏览器可以上网;
  • ChatGPT 普通对话可以工作;
  • CLI Codex 可以工作;
  • 但是 Desktop Local Codex 无法工作。

它们并不一定经过完全相同的网络栈和代理配置。


8. 验证根因

完全退出 ChatGPT:

pkill -f '/usr/lib/chatgpt/ChatGPT'
pkill -f '/usr/lib/chatgpt/resources/codex'

然后手动注入代理环境变量启动:

HTTP_PROXY=http://127.0.0.1:7890 \
HTTPS_PROXY=http://127.0.0.1:7890 \
ALL_PROXY=socks://127.0.0.1:7890 \
http_proxy=http://127.0.0.1:7890 \
https_proxy=http://127.0.0.1:7890 \
all_proxy=socks://127.0.0.1:7890 \
/usr/lib/chatgpt/ChatGPT

重新打开:

~/franka_ros2_ws

Local Codex 立即恢复正常

至此根因得到完整验证。


9. 永久解决:修改用户级 Desktop Launcher

每次从终端启动显然不方便,因此可以修改 Ubuntu Desktop Launcher。

首先找到 ChatGPT:

grep -ril "ChatGPT" \
/usr/share/applications \
~/.local/share/applications \
2>/dev/null

本机结果为:

/usr/share/applications/chatgpt.desktop

不要直接修改系统文件。

创建用户级副本:

mkdir -p ~/.local/share/applications

cp /usr/share/applications/chatgpt.desktop \
   ~/.local/share/applications/chatgpt.desktop

检查:

grep '^Exec=' ~/.local/share/applications/chatgpt.desktop

原始内容:

Exec=chatgpt %U

将其替换为:

Exec=env HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890 ALL_PROXY=socks://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 https_proxy=http://127.0.0.1:7890 all_proxy=socks://127.0.0.1:7890 /usr/lib/chatgpt/ChatGPT %U

可以直接运行:

sed -i \
's|^Exec=chatgpt %U$|Exec=env HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890 ALL_PROXY=socks://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 https_proxy=http://127.0.0.1:7890 all_proxy=socks://127.0.0.1:7890 /usr/lib/chatgpt/ChatGPT %U|' \
~/.local/share/applications/chatgpt.desktop

确认:

grep '^Exec=' ~/.local/share/applications/chatgpt.desktop

然后刷新 Desktop Database:

update-desktop-database ~/.local/share/applications 2>/dev/null || true

完全退出 ChatGPT:

pkill -f '/usr/lib/chatgpt/ChatGPT'
pkill -f '/usr/lib/chatgpt/resources/codex'

之后直接从 Ubuntu 应用菜单点击 ChatGPT 图标启动即可。


10. 验证永久修复是否生效

启动 ChatGPT Desktop 后找到它的 Codex app-server:

pid=$(pgrep -f '/usr/lib/chatgpt/resources/codex .*app-server' | head -1)

echo "Desktop Codex PID: $pid"

检查代理环境:

tr '\0' '\n' < "/proc/$pid/environ" | \
grep -iE '^(http_proxy|https_proxy|all_proxy|HTTP_PROXY|HTTPS_PROXY|ALL_PROXY)='

正常情况下应该出现:

HTTP_PROXY=http://127.0.0.1:7890
HTTPS_PROXY=http://127.0.0.1:7890
ALL_PROXY=socks://127.0.0.1:7890

http_proxy=http://127.0.0.1:7890
https_proxy=http://127.0.0.1:7890
all_proxy=socks://127.0.0.1:7890

此时 Desktop Local Codex 可以正常工作。


11. 为什么推荐修改 ~/.local/share/applications

Ubuntu 中存在两套常见的 Desktop Entry:

系统级:

/usr/share/applications/

用户级:

~/.local/share/applications/

对于这种场景,更推荐复制一份到用户目录再修改:

/usr/share/applications/chatgpt.desktop
                │
                │ copy
                ▼
~/.local/share/applications/chatgpt.desktop
                │
                │ 修改 Exec
                ▼
          注入代理环境变量

这样有几个优点:

  1. 不需要修改系统文件;
  2. 不需要 sudo
  3. 只给 ChatGPT 注入代理,不影响其他程序;
  4. ChatGPT 软件包更新系统级 .desktop 文件时,不容易直接覆盖用户级配置。

需要注意:

后续不要再次把 /usr/share/applications/chatgpt.desktop 复制覆盖到 ~/.local/share/applications/chatgpt.desktop,否则自定义的 Exec= 会被覆盖。


12. 排障过程中最重要的经验

这次问题最大的误导是:

“Codex CLI 正常,所以 Desktop Codex 应该也正常。”

实际上并不是。

在 Linux 下遇到类似问题,应该直接查看实际进程:

ps aux | grep -Ei 'chatgpt|codex'

然后通过:

/proc/<PID>/environ

比较不同进程真正获得的环境变量。

例如:

tr '\0' '\n' < /proc/<PID>/environ

这比单纯运行:

env

更有价值。

因为:

env

只能说明:

当前 Shell 有哪些环境变量。

而:

/proc/<PID>/environ

回答的是:

真正发生网络问题的那个程序,到底拿到了哪些环境变量。

这是两个完全不同的问题。


13. 总结

本次问题最终可以浓缩为一句话:

Ubuntu Shell 中已经配置代理,但从图形桌面启动的 ChatGPT App 没有继承这些代理变量,导致 App 内置的 Local Codex Runtime 无法正常连接网络;通过在用户级 .desktop 文件的 Exec= 中显式注入 HTTP_PROXYHTTPS_PROXYALL_PROXY 即可解决。

最终状态:

组件 修复前 修复后
ChatGPT 普通对话
Codex CLI
SSH Codex
Desktop Local Codex ❌ Reconnecting
Desktop Codex Proxy Env

整个排障过程中最关键的一步并不是重装,而是比较:

Codex CLI process environment
            VS
ChatGPT Desktop Codex process environment

一旦发现:

CLI Codex       → 有 HTTP_PROXY
Desktop Codex   → 没有 HTTP_PROXY

问题就基本解决了。


TL;DR

如果你在 Ubuntu 上遇到:

Codex CLI 正常
+
ChatGPT Desktop 普通对话正常
+
ChatGPT Desktop Local Codex 一直 Reconnecting

而你的网络依赖本地代理,可以先尝试:

HTTP_PROXY=http://127.0.0.1:7890 \
HTTPS_PROXY=http://127.0.0.1:7890 \
ALL_PROXY=socks://127.0.0.1:7890 \
http_proxy=http://127.0.0.1:7890 \
https_proxy=http://127.0.0.1:7890 \
all_proxy=socks://127.0.0.1:7890 \
/usr/lib/chatgpt/ChatGPT

如果这样启动后 Local Codex 立即恢复,那么基本可以确认:

ChatGPT Desktop 没有正确继承代理环境变量。

之后将代理变量写入用户级:

~/.local/share/applications/chatgpt.desktop

Exec= 即可实现永久修复。

本文Blog使用chatgpt帮助整理和生成
posted @ 2026-09-03 17:58  霜尘FrostDust  阅读(29)  评论(0)    收藏  举报