一切从一条消息等了 22 分 48 秒开始

4 月 17 日下午五点半,我像往常一样在 Claude Code 里写代码。准备让它帮我调一下个人网站上的视频动画节拍。

发了条消息,等。

2 分钟。5 分钟。8 分钟。10 分钟。20 分钟。22 分 48 秒。Claude 还在 "Puzzling..."

我改了一个单元格的设定,再问一次。这次等了 20 分 30 秒。

让它 Write 一个 shell 脚本。34 分 48 秒。

发一条文字、读一个文件、写一个文件,都要等 10 到 30 分钟。

我第一反应:是不是同一个窗口开了两个 agent 冲突了?重启 Claude Code。没用。

我第二反应:API 抽风?换个账号试。还是这样。

然后我打开了活动监视器。

诊断出一个死亡数字

终端敲了几行命令,输出摆在眼前:

第一行正常,下面三行是死亡指标


第一行正常,下面三行是死亡指标

fileproviderd 是 macOS 管理 iCloud 同步的守护进程。它吃掉了我电脑两个 CPU 核心,已经连续跑了 6 个小时

为什么这么忙?我敲了 brctl status(Apple 官方的 iCloud 状态工具):

iCloud 在反复尝试下载 node_modules 里的小文件,每次都超时


iCloud 在反复尝试下载 node_modules 里的小文件,每次都超时

iCloud 在反复尝试下载我项目里的 node_modules。每次都失败。每次都重试。

连续 6 小时。

真相的三根毒刺

刺 1:代码放在了 Desktop

macOS 有一个很"贴心"的默认功能——桌面与文稿文件夹同步。勾上之后,~/Desktop/~/Documents/ 里所有东西都会被 iCloud 自动同步到云端。

我的主力工作目录 ~/Desktop/Final-OPB/5.3 GB 数据、76 万个文件、16 个子项目。全部在 iCloud 同步池里。

刺 2:node_modules 成了 iCloud 杀手

敲了一行命令,结果 576 个 node_modules 目录。每个里面几千到几万个小文件,总计大约 22 万个 npm 包文件,全部被 iCloud 当成"用户文档"要同步。

业界铁律:node_modules 绝对不能被同步。可再生(npm install 就能重建)、数量巨大、写入频繁。

刺 3:代理软件劫持了 iCloud

再敲:

DNS 被劫持到 198.18.x.x 的 fake-IP 段


DNS 被劫持到 198.18.x.x 的 fake-IP 段

看到 198.18.x.x 我心里咯噔一下——这是代理软件的 fake-IP 段。我电脑上的代理把 iCloud 的流量路由到了假 IP。iCloud 根本连不上 Apple 的真服务器。

三根毒刺叠加

一条因果链把电脑拖死


一条因果链把电脑拖死

我平时写代码,变成了和 fileproviderd 争 CPU 的斗士。

Day 1:一个下午掉进深坑

17:30 · 发现异常

第一次感觉到卡。重启 Claude Code 无效。开始怀疑系统。

18:00 · 第一次诊断

查出 fileproviderd 吃 CPU。发现一个 hook 脚本每次 Write 后都在 76 万文件的 git repo 里跑 git add -A && git commit。禁掉。没用——这不是主因。

19:30 · 尝试搬家

试图把项目从 Desktop 挪到 Code:

mv 根本动不了


mv 根本动不了

21:00 · 我犯了最大的错误

我想当然地以为:暂停 fileproviderd 进程,mv 就能过了吧?

mv 从超时变成了永久卡死


mv 从超时变成了永久卡死

事后才知道原因:kernel 的 rename() 系统调用必须通过 XPC 等待 fileproviderd 响应。把 fileproviderd 冻住等于 kernel 在等一个永远不会动的人。

这一步是整个过程里最致命的操作。

21:30 · 清理 node_modules

既然搬不动,那就让 iCloud 队列里的"货"少点。保留 3 个在用的项目,删掉其他 122 个:

  • 删 20 个最大的:16 秒

  • 删剩 102 个小的:1 秒

  • 共消除 225,916 个文件离开 iCloud 队列

  • fileproviderd CPU 从 180% 降到 87%

第一次看到胜利曙光。

23:00 · 再 mv,还是卡

理论上队列小了应该行。再试——180 秒超时,杀掉。大目录 rename 本身就被 FileProvider 死锁了,和文件数关系不大。

Day 1 小结

  • 耗时:约 6 小时

  • 成果:删了 22 万个文件,但核心目标没达成

  • 心情:崩溃,骂了 AI 好几次

  • 额外:写了两份 SOS 执行手册,怕第二天自己崩溃时看着干

Day 2:苹果店 + 网线 + 下载 15GB

上午 · Safe Mode 失败

Apple Silicon 的 Safe Mode:关机 → 长按电源键 → 按 Shift + Continue in Safe Mode。

网上说 Safe Mode 下 fileproviderd 会降到 0.2%。

实际:降到 161.7%。和正常模式几乎没差。Safe Mode 对这种已经腐烂的队列无效。

下午 · 去 Apple Store

问题根本:代理劫持了 DNS,iCloud 连不上真服务器。即使关了代理,家里网络不一定能直连 Apple 中国区的云上贵州。

我最后决定:去 Apple Store

  • 用他们店里的企业级网络(直连 Apple 基础设施)

  • 接网线(消除 WiFi 不稳定)

  • 让 iCloud 真真实实地把文件下载完

这一步没法快进。就是耐心等。

2 小时,从 5.1 GB 涨到 16 GB,全部下载回本地


2 小时,从 5.1 GB 涨到 16 GB,全部下载回本地

用 cp 而不是 mv

cp -a 把完整的 Final-OPB 从 Desktop 复制到 ~/Code/。Apple Store 的网络下没被 fileproviderd 拖累,正常完成。

为什么用 cp 不用 mv:cp 是复制,失败了原版还在。mv 是移动,中间失败就两边都坏。这是我这次最重要的一条学费。

Day 2 小结

  • 耗时:8-10 小时

  • 成果:所有文件从云端回本地,完整副本落地 ~/Code/

  • 心情:至暗时刻的转折点

Day 3:收尾,比想象的复杂

20:00 · 验证 cp 完整性

差 0 个字节,三层校验全部匹配


差 0 个字节,三层校验全部匹配

但还不能高兴。接下来是四个没想到的坑。

坑 1:Claude Code 看不到旧历史

Claude Code 按项目路径存对话历史。从新路径启动的 Claude Code 看不到旧历史——78 个 session 留在了 Desktop 对应的目录里。

解决:用 cp -rn 把旧 session 同步到新路径。78 个 jsonl + 107 个 memory 全部跟过来。

坑 2:jsonl 里的 cwd 字段还是旧路径

/resume 按 session 里记录的 cwd 过滤。所有旧 session 里 cwd 还写着 Desktop。

解决:用 sed 批量替换 cwd 字段,只改 cwd,不动对话内容。每个 jsonl 备份成 .orig

坑 3:sed 改了 mtime,排序乱了

sed 会更新文件 mtime,所有 session 看起来都是"4 分钟前"。/resume 的时间排序退化成文件名字母序,377 MB 的大 session 被挤出前 50。

解决:用 touch -r 把原文件的 mtime 盖回新文件。排序立刻恢复。

坑 4:2185 个文件硬编码了 Desktop 路径

最大的一个坑。项目里有 2185 个文件硬编码了 /Users/yanlongmu/Desktop/Final-OPB

  • 1643 个 .pyc → 不用改(重建即可)

  • 258 个 .map → 不用改(构建产物)

  • 70 个 .md → 不用改(历史记录)

  • 100 个 .py / .sh / .json / .ts / .yaml必须改

批量替换时用 sed -i.bak 保留了 104 个 .bak 备份文件。残留 0,每个改动都有回滚点。

Day 3 小结

  • 耗时:2.5 小时

  • 成果:系统完全可用,硬编码清零,session 历史完整回归

血的 7 条教训

1 · 代码项目绝对不要放 ~/Desktop/ 或 ~/Documents/

如果你开了 iCloud "桌面与文稿"同步,现代开发项目动辄几万个文件,iCloud 会把它变成无底洞。

正确做法:在 ~/ 下新建 Code/Projects/ 目录。这两个 macOS 默认不同步。

2 · node_modules 永远不能被云同步

iCloud / Dropbox / OneDrive 都不行。如果非要放同步目录,用 .nosync 后缀 + symlink:

mv node_modules node_modules.nosync
ln -s node_modules.nosync node_modules

3 · 代理软件必须给 Apple 域名加白名单

不然一旦开 iCloud,流量被劫持到 fake-IP,fileproviderd 会反复重试到把电脑拖死。

需要直连的域名:*.icloud.com*.icloud-content.com*.apple.com*.mzstatic.comgateway.icloud.comsetup.icloud.com

4 · 永远不要 kill -STOP fileproviderd

macOS 的 FileProvider 是 kernel → XPC → fileproviderd 三层架构。冻住 fileproviderd 等于 kernel 里的 rename/unlink 系统调用永远等不到回复,比卡住还糟。

要杀就 -9(launchd 会拉起新的)。更好的是根本别动它。

5 · Safe Mode 对 iCloud 卡死不是银弹

网上很多文章说 Safe Mode 下 fileproviderd 会降到 0.2%。实测:如果队列已经腐烂,Safe Mode 也救不了。大目录 rename 依然卡。

6 · 网络才是 iCloud 的真命题

如果你在中国大陆,iCloud 走的是云上贵州。任何代理 VPN 都可能让它废掉。两个可行路径:

  • 代理加白名单(首选)

  • 出问题去 Apple Store 用他们网络(终极手段)

7 · 任何危险操作前先问:失败了我能回到哪

我这次没丢数据,不是运气,是习惯:

  • cp 不用 mv → Desktop 原版始终完好

  • sed 加 -i.bak → 每个修改都有备份

  • session history 用 cp -rn → 不覆盖新的

  • 验证完整性(文件数、目录数、字节数三层 diff)才算成功

三层保险原则:任何操作都要有"失败能回到哪"的答案。

时间账单

16-18 小时 · 跨 3 天 · 废掉 2 个工作日


16-18 小时 · 跨 3 天 · 废掉 2 个工作日

时间内容耗时Day 1(4/17)发现 + 诊断 + 失败尝试 + 删 node_modules约 6 小时Day 2(4/18)Safe Mode + 苹果店 + 网线下载 15GB约 8-10 小时Day 3(4/19)cp 验证 + session 迁移 + 硬编码修复约 2.5 小时总计约 16-18 小时

跨度 3 天,废掉 2 个工作日。"今天要上线个人网站"的窗口期被这场灾难吞了。好在一人公司没有甲方催,只有我自己。

如果你只看一句话:

把代码项目从 iCloud 管辖的目录(Desktop / Documents)里搬出去,放到 ~/Code/ 下。

如果你已经放了,今天就搬。

工具箱 · 本次用到的救命命令

  • brctl status — 查 iCloud 同步状态

  • ps aux | grep fileproviderd — 查守护进程 CPU

  • dig +short icloud.com — 查 DNS 是否被代理劫持(17.x.x.x = OK,198.18.x.x = 劫持)

  • brctl download ~/path — 强制 iCloud 下载某目录

  • find . -type d -name node_modules -prune | wc -l — 查项目有多少 node_modules

  • sed -i.bak 's|旧路径|新路径|g' — 批量改路径(带 .bak 备份)

结语

以前觉得 iCloud 是云服务,默认开启总是好的。

现在知道,一个默认开启的"好意",可以让一个专业开发者连续 3 天无法工作

平台的默认值设计,决定了多少普通用户会在某个意想不到的角落踩坑。

希望这篇文章能帮到你。

如果你已经把项目放 Desktop 了——今天就搬。

2026 年 4 月 19 日,于 ~/Code/Final-OPB/(终于)