云聚 AI Token Plan 满 199 减 35 元
AI编程 · 架构思考 · 技术人生
DigitalOcean 开发者云
Codex.app code_sign_clone 临时目录示意图

Codex macOS code_sign_clone 占几十 GB 磁盘: 真相与清理

28 min read #Codex CLI 深度
#Codex CLI 深度
目录

如果你在搜 com.openai.codex.code_sign_clone,大概率不是想读一篇技术散文,而是磁盘莫名变小、du 之后翻到一堆奇怪的文件夹,想搞清楚这玩意儿是不是病毒、能不能删、删了会不会把 Codex.app 弄坏。先把答案给你:它不是报错,也不是被入侵,是 Codex 桌面应用每次启动都会留下来的临时目录,每次大约 1 GB 左右,从来不清理。

更扎心一点:这是 Chromium 上游设计意图,OpenAI 把它继承下来但没补上”退出时清理”的那一步。所以这篇要做两件事——把 code_sign_clone 到底是什么讲清楚,再把一行清理命令交给你,外加聊一聊在 macOS 上长期跑 AI CLI 工具链需要注意的几个磁盘陷阱。

阿里云 OPC 一人公司创业装备库

先把误解纠正:code_sign_clone 不是错误码

很多人第一次看到 com.openai.codex.code_sign_clone,是在某个磁盘清理工具的报告里,或者 du -sh ~ 之后看到 /private/var/folders/ 下出现一堆陌生目录。名字里又是 openai、又是 code_sign、又是 clone,怎么看都像权限错误或者签名校验失败。

它其实就是一个临时目录的名字。完整路径长得像这样:

/private/var/folders/xx/xxxxxxxxxxxxxxxxxxxxxxxxxx0000gn/X/com.openai.codex.code_sign_clone/code_sign_clone.XXXXXX/Codex.app

里面是一个完整的 Codex.app:Info.plist、可执行文件、Frameworks、所有 Helper,应有尽有。整个目录大概 100 MB 到 1 GB 之间。Codex 每次启动都会生成一个新的,旧的不会被删。如果你装了 auto-update 又长期不重启 macOS,这个目录数能从 5 个滚到 60 个,磁盘很容易就被吃掉几十 GB。

所以没有任何”错误”发生。它的英文字面意思已经写清楚了:code sign clone,”代码签名克隆”。但这不是失败的克隆,而是一次主动复制 + 保留签名状态的正常操作。

它从哪儿来:Chromium 的 App Bundle Clone 机制

code_sign_clone 不是 OpenAI 发明的,它来自 Chromium 浏览器项目里一个叫 code_sign_clone_manager 的子模块。Chromium 引入这套机制的初衷,是为了解决一个非常具体的工程问题:当应用进程仍在跑、auto-updater 准备替换磁盘上的 .app bundle 时,怎么让正在跑的进程继续保持有效的代码签名

macOS 的签名校验既有静态的(启动时验 Info.plist + 可执行文件哈希),也有动态的(运行中校验载入的库、helper、子进程)。如果 updater 把旧的 .app 直接覆盖掉,正在跑的进程一旦触发任何动态校验——比如加载一个 Framework、spawn 一个 Helper——就会因为签名不匹配崩掉。

Chromium 的解法是利用 APFS 的 clone 特性:在临时区克隆一份 .app(实际上是 hard link + 写时复制,几乎不占新空间,10 毫秒级完成),然后用这份 clone 跑业务。Updater 想换 .app 就换 .app,反正运行中的进程读的是 clone 路径,签名永远稳定。这个设计本身是漂亮的。

Codex 桌面端是 Electron 应用,内核就是 Chromium,于是这套 clone 机制原封不动被继承下来。问题在 Codex 没接好 Chromium 留出来的清理钩子——没有在 quit 时调用 clone manager 的回收逻辑,也没有 atexit 注册。Chromium 浏览器自己关掉是会清的,Electron 套壳里多了一层生命周期,链路就断了。

真实用户的现场:几十 GB 不是个段子

如果你不信单次启动能留 1 GB,可以自己跑一行:

du -sh /private/var/folders/*/X/com.openai.codex.code_sign_clone/* 2>/dev/null

社区里报上来的数据基本都很难看。有人 35 个目录 35 GB,有人单一目录 1.2 GB,最夸张的一例是 62 GB——这位老兄装了 Codex 几个月,从不重启 mac,每天用 auto-update,几个月堆下来直接把 SSD 吃干净。

可以叠的几个观察:

  • 100% 来自 Apple Silicon:Intel Mac 几乎没人报告,不是因为 Intel 用户少,是因为 Codex.app 主力分发就是 arm64,且 APFS clone 在 Apple Silicon 的 SSD 上更便宜,触发频率更高
  • macOS Sequoia 15.x 和 Tahoe 26.x 集中爆发:不是这两个版本的锅,是 Chromium M125+ 才引入这套 clone 策略,Codex 用的 Chromium 内核刚好是 M148,所以任何能跑 Codex 的 macOS 版本都会中招
  • 跟你装没装杀软、有没有开 SIP、Gatekeeper 配置无关:这个目录是 Codex 自己写的,签名状态正常,没有任何系统组件会去拦它,也不会主动清

GitHub 上跟这件事相关的 issue 至少 5 个,其中 #25667、#27536、#27789、#28518、#26797 都是同一件事的不同复述。OpenAI 官方至今没有任何 maintainer 回应,最新一个被关掉只是因为标记成了”重复 issue”,没有 fix commit。

一行清理命令

直接给你能跑的:

rm -rf /private/var/folders/*/X/com.openai.codex.code_sign_clone

注意:

  • 路径里的 * 是必须的。/var/folders/ 下面是按用户哈希分桶的,不是固定路径
  • 删之前可以先 du -sh 看一眼省了多少,给自己一点心理安慰
  • 删完不需要重启,Codex 下次启动会重新生成一个新的(约 100-200 MB 起步,跑久了再涨)
  • 如果你用 zsh 且开了 nullglob,路径里 * 没匹配到东西不会报错,正常

不放心的话可以两步走:先 ls 看清楚要删什么,再 rm

ls -lah /private/var/folders/*/X/com.openai.codex.code_sign_clone/
rm -rf /private/var/folders/*/X/com.openai.codex.code_sign_clone

不要去碰下面这些,跟 code_sign_clone 没关系,乱删会出问题:

  • /private/var/folders/*/T/ 下面任何东西(系统应用各种缓存全在这)
  • ~/Library/Application Support/Codex/(你的对话历史、配置)
  • ~/.codex/(CLI 的 token 和会话记录)
  • /Applications/Codex.app/ 本体

为什么 OpenAI 至今没修

这个问题第一次有人报上去是 2026 年 5 月,到现在两个月过去,OpenAI 团队连一句官方回应都没给。按它今年的版本节奏,几乎每周一个 release,但所有 release notes 里都没出现过 code_sign_clonecleanuptemp directory 之类的字眼。我的猜测是这样:

  1. 它不是 P0:Codex 用户绝大多数是 dev 群体,磁盘量都不小,1 GB 一次的泄漏没到逼着你立刻处理的程度。社区自救一行 rm 就能解决,反推回去就是优先级压不上去
  2. 修起来要碰 Electron lifecycle 的脏区:Electron 应用关闭路径分主进程退出、Renderer 退出、Helper 退出三段,要在哪一段调清理才不卡用户操作,不是一行代码能搞定的事
  3. 真正的修复点可能在 Chromium 上游:Codex 团队不一定愿意 patch 自己的 Electron fork,更愿意等 Chromium / Electron 上游统一处理

如果你想让这事推进得更快,去那个还 open 的 issue(27789 是最活跃的一个)点个 +1、贴一下你自己的 du 数据就够了。OpenAI 内部排优先级,多半也是看 reaction 数。

一个很容易被忽视的副作用:备份和同步工具也跟着遭殃

/private/var/folders/ 默认不在 Time Machine、Arq、Backblaze 的备份范围里——但iCloud Drive、Dropbox、OneDrive 在某些配置下会扫到。我见过有人发现 Dropbox 客户端 CPU 永远在 30%,排查半天才发现是 Codex 每天新生成的几 GB 临时文件被错配进了同步队列,后台一直在算 hash 看要不要传云端。

这种二阶效应更难察觉,因为表象不是”磁盘满”而是”风扇响、CPU 高、电池掉得快”。如果你看到上述症状又恰好装了 Codex.app,先去 Console.app 看一眼是不是 bird(CloudKit)或同步客户端在频繁读写 /private/var/folders/。修法跟前面一样:清 clone 目录,并且在同步工具里把 /private/var/folders/ 加进排除清单。

几个名字相近但完全无关的真问题

经常有人把以下这些跟 code_sign_clone 混在一起,搜出来的修复方案胡乱套用,越搞越乱。这里划一下界线:

1. CLI 启动报 “App is damaged” 或权限拒绝

你装的是 codex CLI(不是 .app 桌面端),第一次跑就直接被 macOS Gatekeeper 拦了。这是 com.apple.quarantine 扩展属性的问题,跟 clone 机制无关。解法是:

xattr -d com.apple.quarantine $(which codex)

或者更彻底:

xattr -dr com.apple.quarantine /opt/homebrew/bin/codex

具体路径取决于你怎么装的。Homebrew 装在 Apple Silicon 上是 /opt/homebrew/bin/,Intel Mac 是 /usr/local/bin/。npm 全局装的话路径在 $(npm config get prefix)/bin/codex

2. codesign --remove-signature 不要乱用

我看到有教程教大家用 codesign --remove-signature /Applications/Codex.app 来”修签名”。这跟 code_sign_clone 完全没关系,反而会把签名状态彻底破坏,下次 auto-update 失败、Helper 不能 spawn、CUA service 直接 SIGKILL。除非你知道自己在做什么(比如调试 entitlements),别碰这个命令。

3. SkyComputerUseService、CUA Helper SIGKILL

这是另一类完全不同的问题,跟 macOS 的 Launch Constraints 系统有关。如果你在 macOS 26.x(Tahoe)上跑 Codex 的 Computer Use 功能看到 SkyComputerUseServicecom.openai.sky.CUAService 被 SIGKILL,那是 Apple 收紧了 Helper 的允许启动规则,需要 Codex 团队更新签名配置。社区里也有 issue 跟,跟磁盘泄漏不是同一件事。

4. ~/.codex/ 越来越大

CLI 模式下 ~/.codex/ 会存放对话历史、Session token、模型缓存。如果你高频用 Codex CLI,这个目录也会涨,但单位是 MB 不是 GB。要清的话直接进去看 sessions/cache/ 子目录,按时间删旧的,不会影响登录态。

临时方案 vs 中期方案

短期能做的:把这行加到你的 crontab 或 launchd plist 里,每天凌晨 3 点清一遍:

0 3 * * * rm -rf /private/var/folders/*/X/com.openai.codex.code_sign_clone 2>/dev/null

或者写成一个 .zshrc 别名,每次开终端的时候手动 cleancodex 一下:

alias cleancodex='du -sh /private/var/folders/*/X/com.openai.codex.code_sign_clone/* 2>/dev/null; rm -rf /private/var/folders/*/X/com.openai.codex.code_sign_clone'

如果你想做得更工程化一点,可以把这条命令放进 launchd .plist,让它跑得比 cron 更稳——cron 在睡眠状态下不会唤醒系统,launchd 会。StartCalendarInterval 设凌晨 3 点,LowPriorityIO 设 true,跑起来既不抢盘也不会被电量管理误杀。这套做法在自动化 AI 工具链运维上挺通用,我在 OpenClaw 自动化 Agent 运维实战:从 Cron 报错到系统性治理 里展开过一次完整的 cron → launchd 迁移踩坑记录,思路是一样的。

中期能做的:

  • 关闭 Codex.app 的自动更新。Settings → General → Automatic Updates 关掉。这不会减少单次启动的克隆量,但能减少每次更新触发的额外克隆——auto-update 流程会先 clone 一份新版本,再 swap 旧版本,整套下来克隆数翻倍
  • 改用 Codex CLI。如果你的日常工作流不强依赖桌面端的 UI(编辑器集成、对话历史浏览),CLI 完全没有这个问题,因为 CLI 不是 Electron 应用,不走 Chromium 那套 clone 机制。Codex CLI 的本地部署可以参考 不等 Cursor 企业版:Codex CLI 本地部署完整实战。CLI 和桌面端在心智模型上其实是两套东西,Claude Code CLI 最新指令集:别再只会 /clear 了 这篇文章里聊过同类的 CLI 优先论:长期跑 AI 工具的人,CLI 永远比桌面端更省事、更可控、更可脚本化
  • 定期重启 macOS/var/folders/ 在系统重启时会清掉一部分(按 purgeable space 规则),不靠谱但有用

长期方案:等 OpenAI 在 Codex 的 Electron 主进程 quit 路径接好 clone manager 的清理调用。从历史经验看,这种”用户日常会撞但不影响核心功能”的 bug,OpenAI 修复周期通常在 3-6 个月。

顺手看:macOS 上”clone-on-update”为什么成主流

我顺着这件事去看了一圈,发现 macOS 桌面应用最近两年大量在用同一套模式:APFS clone + 临时目录跑业务 + 写时复制。Chrome、Edge、Discord、Slack、VS Code、Cursor,凡是基于 Electron 或 Chromium 的应用,几乎都引入了类似机制。

这件事还有一段前情。早年 macOS 桌面应用做”无感更新”,主流方案是 Sparkle 框架——一个第三方更新库,原理是下载新版 dmg/zip、退出当前应用、解压覆盖、重启。Sparkle 体验已经不错,但它的核心矛盾是必须退出当前应用。对短任务工具问题不大,对长会话型应用(浏览器、IDE、IM)就要命:你正在跟 AI 对话到一半,应用提示要重启更新,体验上是个明显的中断。Chromium 这套 clone-on-update 是为了把”必须退出”这一步也去掉,让更新对用户彻底无感。我之前在 Telegram macOS 安装踩坑全记录 里也聊过类似的更新策略对比,可以看到不同应用为了”无感更新”做了多少奇技淫巧。

这本质上是为了解决一个产品决策矛盾:

  • 用户希望应用更新无感、不打断当前操作
  • 但 macOS 签名校验要求运行中的进程二进制不能被替换

APFS 的 clone 是个非常便宜的原语(10 毫秒级别、不消耗额外块空间),所以这套模式天然适合 macOS。问题是 macOS 系统层没有提供”我克隆出来的临时副本什么时候该清”的生命周期标记。每个应用都得自己接 atexit、自己处理崩溃恢复,于是泄漏是普遍现象,只是程度不同。

我手头那台用了一年的 M2 MacBook,跑 du -sh /private/var/folders/*/X/ 一下出来 12 GB,里面有 Codex 的 1 GB,有 Cursor 的 800 MB,有 Discord 的几百 MB,剩下都是各种 Helper 进程的临时缓存。这不是 Codex 独有的坑,是整个 Electron 生态在 macOS 上的通病。Codex 只是因为单次克隆体量更大、更新更频繁,被先骂出圈。

在 macOS 上长期跑 AI CLI 工具链需要注意的事

借这次的事讲两句更系统的看法。如果你在 macOS 上长期用 Codex、Claude Code、Cursor、Cline 这一类工具,会发现磁盘消耗远比想象中快。原因不止 code_sign_clone:

  • 每个 CLI 都有自己的 cache、log、session~/.codex/~/.claude/~/.cursor-server/ 等等,加起来很容易上 GB
  • 依赖装在 node_modules / .venv 里。如果你给不同项目都装 @anthropic-ai/claude-code 全家桶,本地 node_modules 加起来非常恐怖
  • Electron 桌面端的 cache~/Library/Application Support/ 下各 AI 应用动辄几百 MB 起步
  • 模型权重不算少。本地跑 Ollama 一个 70B 模型就是 40 GB,多装几个能瞬间把 SSD 干掉

一些可参考的实践:

macOS 排障思路:磁盘异常的几个常见根因

不光是 Codex,整个 macOS 工具链上磁盘异常的根因基本就那么几类,我按照踩过的频次排个序:

  1. Electron 应用的临时 clone——也就是这次的 code_sign_clone 一类,1-50 GB 量级
  2. Homebrew 的依赖混乱——升级链路里某个老依赖没清,新依赖又装了一份。这种问题我在 OpenClaw 在 macOS 突然”全挂”排障实录:Homebrew 动态库 ABI 漂移 里详细写过,本质是 brew 的依赖管理在多个大版本切换时容易残留
  3. 本地模型权重忘记清——Ollama、LM Studio、MLX 跑过的模型不会自动清理。彻底卸载 macOS 上的 Ollama 里有一份手动清理路径列表
  4. node_modules 累积——尤其是 CLI 工具全局装时,多次升级会留下旧版本副本
  5. iCloud Drive 本地缓存——这是另一类很难察觉的,单文件几百 MB,攒起来惊人

排查节奏一般是这样:先 df -h 看哪块满,再 du -sh /* 找大头,再往下逐层 du -sh dir/*。不要直接信桌面端的”关于本机 → 储存空间”,它经常把”其他”算得很离谱。

写在最后

code_sign_clone 这个名字看起来吓人,本质就是 Chromium 上游一套”App Bundle 克隆 + 写时复制”机制的副作用,Codex 桌面端是 Electron 套壳所以继承了它,只是没接好清理钩子。修复的事 OpenAI 还在拖,目前最有效的方案就是那行 rm -rf 命令,或者干脆挂到 cron 里。

更大一层的看法是:Electron 把”跨平台桌面”做到了能用,但 macOS 这套生命周期 + 签名 + 临时目录的设计,本来就没有为”频繁热更新的 GUI 应用”做优化。这类磁盘泄漏未来还会反复出现在新的 AI 工具上,不是 Codex 独有。养成定期审计磁盘 + 用 Mac 磁盘清理工具 之类的工具盯一下大块异常增长的习惯,对长期跑 AI 工具链的人是个值得做的功课。

回到工程审美的层面想:好的工具应该让用户感知不到自己的运行成本。一个每次启动悄悄写 1 GB 进 /var/folders/ 还不清的应用,技术上能跑,但工程心智上是不及格的。这种细节决定了一款工具是”能用一年的生产力工具”还是”装上吃灰一周就卸的玩具”。希望 Codex 团队尽快把这块补上——毕竟从 Codex CLI 完整入门 看,整个 Codex 产品线在能力上确实是顶尖的,缺这一脚拼图太可惜。

如果你想顺着这条线继续看 AI 工具的工程化,Claude Code 在做减法Agent Harness 到底是什么?万字入门 是两篇值得读的。前一篇讲产品收敛的思路,后一篇讲怎么把 AI 工具组装成可以自己跑的系统。再往前一步,从写 Prompt 到写 Loop 讲的是从对话式工具往循环式 Agent 的过渡——这一波 AI 工具链整体的演化方向,跟磁盘泄漏这种细节看起来不挨着,但都是同一个母题:工具的工程心智到不到位

未经允许不得转载:Toy's Tech Notes » Codex macOS code_sign_clone 占几十 GB 磁盘: 真相与清理
阿里云函数计算 一键部署 AI 大模型

Claude Code 合租 · KYC 封号全托管

官方又涨价又 KYC,封号还得自己重新折腾?ReClaude 拼车了解一下——200 / 400 / 800 / 1600 四档随便挑,账号、风控、切换全平台托管,触发风控自动换号不计次。

上车 4 人车 400/月查看四档套餐