Ubuntu ChatGPT Desktop App bug:Codex CLI 正常,但本地项目一直 Network Reconnecting 的排查与解决
1. 问题背景
最近在 Ubuntu 上使用 ChatGPT Desktop App 时遇到了一个比较奇怪的问题:
- ChatGPT App 中普通 ChatGPT 对话正常;
- ChatGPT App 可以正常连接 SSH 远程项目,并使用 Codex;
- 本机
codexCLI 可以正常使用; - 但是 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
▼
注入代理环境变量
这样有几个优点:
- 不需要修改系统文件;
- 不需要
sudo; - 只给 ChatGPT 注入代理,不影响其他程序;
- 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_PROXY、HTTPS_PROXY和ALL_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帮助整理和生成

浙公网安备 33010602011771号