一组 2026-10-16 实测数字:openai/codex 要求把守护进程默认启动改为 opt-in(选择性加入)的 issue #48195 获 181 个 +1、仍 open;HN 帖 50060694 拿到 607 分、全树 292 条评论(口径:292 为 HN API 全树数含已删除,顶层回复 58)。被讨论的对象是约 374 MB 的平台包:从 0.157.0 版起,打开一次交互式 codex 会话,它就被复制进家目录、变成常驻进程、带着每小时一次的自更新循环,关窗后继续活着。全文数字均为 10-16 经 GitHub、HN、npm 接口重测,转述除外。
核心判断:会话级应用正在滑向常驻基础设施
Codex CLI 守护进程事件标志着 Agent 工具的分发范式从「会话级应用」切换为「常驻基础设施」,配套的是消费软件式的更新模型——默认开启、静默安装、小时级自更新、退出包管理器管辖;当 harness(包裹大模型、管理工具调用与会话的执行框架)自己变成守护进程,工程师对版本、进程、配置三项主权的默认持有即被没收。这不是单家公司的偶发事故。本刊第 13 期《智能体正从应用循环迁为集群一等负载》论证的是同一条迁移曲线的数据中心侧,本期是它的镜像:同一种「Agent 是长期工作负载」假设,未经同意就落在笔记本上。集群侧是工程师主动设计的,本机侧是默认值替你决定的,差别正是争议来源。与近三期的边界:第 15 期是分发渠道,第 16 期是运行前的权限载体,第 17 期是事后取证;本期不是审计行为,而是安装时的默认值与退出路径——软件在你没做任何选择前,已经替你驻留了下来。
机制拆解:一次交互会话之后,机器上多了什么
按 #48195 作者的复现步骤,打开一次 codex 会话后,机器上多出四个东西:
- 一个常驻守护进程。
codex app-server --managed-daemon以独立会话、无 TTY(终端通道)启动,reparent(父进程退出后被系统收养)到PID 1,关窗不退出,直到daemon stop或重启。 - 一份 374 MB 的平台包副本。
codex、codex-code-mode-host及打包的 bwrap、zsh、rg 整体复制进~/.codex/packages/.../releases/<version>/并从副本运行,包管理器与真正干活的后端从这一刻脱钩。 - 一个分离式更新器。
pid-update-loop:启动 5 分钟后首查,此后每小时一次,下载新版并重启后端。 - 一份被固定住的环境。daemon 钉住「谁先启动它」那个会话的环境变量:作者的首会话带 HTTPS_PROXY,此后所有会话出站流量都被它钉死。关联
#42457(hooks 收到 daemon 工作目录),同一病根。
四样东西归到三个抽屉,就是「三样主权」。版本主权回答「跑的是不是你装的二进制」:以前答案是平凡的「是」,现在 npm update 升的是 CLI 壳,后端来自 ~/.codex/packages 里更新器挑的那份。进程主权回答「它何时结束」:会话结束不再等于进程结束,唯一自动退出条件是重启。配置主权回答「它带谁的环境活到明天」:是启动它的那个会话。
证据链时间线:从 60 秒 SIGKILL 到 607 分头版
按日期排开,能看到一路有信号、一路没刹车(以下全部实测):
- 信号期(08-26 至 09-18):
#40969立案——自动更新只给60秒 drain(等在跑任务收尾的窗口预算),超时SIGKILL(强制终止信号)杀掉在跑的 turn(一次连续工作单元),且无关闭方式;#41188请求外部管理 daemon(+1共9);#42457环境钉住;#46468双通道打架。至今全部 open。 - 默认启用(09-25):0.157.0 发布(Releases 与 npm 同日),后台启动在发布说明只占一句「Enabled automatic background-server startup」,混在十余条特性里无告示;同日
#48050(Arch 不加--no-daemon无法启动)、#48195(要求改 opt-in)立案。 - 引爆期(10-08 至 10-13):0.163.0 的 alpha 连发 11 版、10-15 转正 latest,小时级循环对着日更级发版流;10-12 HN 帖发布(10-16 实测
607分);10-13#53547立案环境变量跨会话泄漏。
最锋利的细节是关闭路径。daemon stop 停了 app-server,pid-update-loop 却还活着 70 秒,需手动 kill——关不干净是作者实测。文档侧据用户 foma-agent 核对(转述,10-16 复测仍查无此条目),官方 config 参考页对 daemon_auto_start 零条目,唯一可见的关闭方式是 config.toml 的 feature flag(whimblepop 实测、多人复贴)。
反方观点与边界条件:争的不是自动更新
HN 线程(实测全树 292 条评论)逐条扫下来,至少两条反方论据有实质力量,边界条件也必须写清楚。
反方 A:「浏览器都自动更新,harness 凭什么不」(用户 dingaling911,评论可查)。这条不是歪理:Chrome、Firefox 的静默自动更新运行了十几年,是最成功的供应链安全实践之一。先声明口径:「浏览器更新自带进程沙箱所以可接受」在线程中并无评论直接提出,属流行类比,按「常见主张」评估——浏览器更新默认有进程边界与沙箱,而 harness 持有整台机器的读写、网络和凭据,更新的是执行环境而非查看器,爆炸半径不同量级。线程内的反驳:icantevenhold 称其浏览器更新需批准;swatcoder、wtallis 认为快速迭代不构成默认塞给专业工具变更的权利。
反方 B:「企业跑 npm mirror,交付天然接进 IT 合规框架」(用户 judge2020,评论可查)。这条被机制事实削弱:镜像管得住 npm 安装那一瞬间,管不住 ~/.codex/packages 里的小时级自更新。合规链在复制包这步断掉,反方 B 其实是提案方——恰恰证明包管理器管辖权被绕开。
用户主权论与合理面。用户 thebeardisred 肯定发行版模式的价值:有人打包、测试、给出合理默认,挡住这类小动作,隐含场景(交付前不希望工具被更新改变)是具体的。反过来,「有 bug 才等新版本」的需求也确实存在。两面摆清就能看出:争议焦点不是「要不要自动更新」,而是「默认值加可见性加退出路径完整性」——默认开启而非 opt-in;发布说明一句话、config 文档零条目;唯一的关闭命令 stop 漏杀更新器。三样都有解,都不需要牺牲自动更新的安全收益。
正方阵营的过度部分也要标注口径。GitHub 评论里 laurynas-karvelis 的「a trait of malware」类比与 shakefu 的回退 license 言论已核实存在,属情绪信号;用户 icantevenhold 称旧版本占约 12 GB、AgharaShyam 称 ~/.bun/install/cache 有 11 个约 300 MB 的二进制,评论真实存在但系各人本机观察、未复现,仅作感知强度引用。
生态同构、双通道分叉与实操
单品失误的解释在生态同构面前变弱:timdorr 贴出本机清单,Claude Code 在 ~/.local/share/claude/versions/ 驻留多版本且有 claude bg 后台进程,同款形态;HackerThemAll 称 Claude 桌面版唤醒后残留约二十几个进程(转述,未复现)。
双通道分叉是这类形态最安静的症状。#46468 是完整剧本:npm update 后 CLI 壳升到新版,app-server 停在旧版,让 daemon 恢复又拒绝走预期路径——包管理器认为装了 A,更新器认为跑了 B,合在一起没人知道真相。#48050 是另一面:打包者要显式加 --no-daemon 才能让软件在发行版体系里工作,它已不再假设「安装即文件、运行即会话」的传统契约。
自查与关闭,#48195 正文已给出实测过的 workaround:先用 ps aux 与 du -sh 观测 codex app-server、pid-update-loop 进程与 ~/.codex/packages/app-server-daemon 目录;关闭则依次执行 codex features disable daemon_auto_start、daemon stop、pkill -f pid-update-loop 并删复制包目录,stop 后确认更新器残留;或在 config.toml 的 [features] 段写 daemon_auto_start = false(whimblepop 实测、多人复贴,升级后复查)。
企业环境:走内网 npm 镜像的话,把 ~/.codex/packages 与 ~/.codex/app-server-daemon 纳入终端合规扫描(完整性基线或 MDM 策略)——镜像层管不到这里,防御要打在缺口上。
未来一到两个雷达周期:五个观察点
五个观察点各有判据:
- 厂商让步信号:
#48195是否翻转默认 opt-in、daemon_auto_start是否进官方文档,其一落地即让步。 - 同构蔓延信号:Claude Code、Cursor、OpenCode 等是否被实测出常驻、小时级自更新、复制包三件套;Claude Code 已有
versions/驻留证据,差默认自更新实锤。 - 第一次事故实锤:是否出现自动更新引入回归的有名有姓事件;
#40969已具备全部要素,只差一次真实事故。 - 发行版与企业反制:Arch/AUR 等是否系统性加
--no-daemon补丁;MDM(终端管理)是否出现 daemon 禁用模板。已有 Nix 打包层补丁掉该行为的先例(whimblepop)。 - 治理同构信号:是否有人把 agent daemon 纳入工作负载治理工具链——衔接第 13 期:集群侧为 Agent 造原语,本机侧连 daemon 都不在任何台账上。
这不是 bug 投诉,而是「Agent 作为工作负载」范式在本机上的一次不请自来。解法不是禁止自动更新——是 opt-in、是文档里那一条、是 stop 杀干净。延伸阅读:第 13 期《智能体正从应用循环迁为集群一等负载》。
References
- openai/codex #48195:daemon_auto_start 改选择性加入
- Hacker News 帖 50060694:Codex CLI 默认安装常驻自更新守护进程
- Codex CLI 0.157.0 Release Note
- openai/codex #40969:60 秒 drain 与超时 SIGKILL
- openai/codex #53547:环境变量跨会话泄漏
- openai/codex #46468:npm 与 daemon 双版本通道冲突
- openai/codex #48050:Arch Linux 需 –no-daemon 才能启动
- openai/codex #41188:支持外部管理的 daemon 可执行文件
- openai/codex #42457:hooks 收到 daemon 工作目录