
一切从一条消息等了 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。每次都失败。每次都重试。
连续 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 段
看到 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 根本动不了
21:00 · 我犯了最大的错误
我想当然地以为:暂停 fileproviderd 进程,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,全部下载回本地
用 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 个字节,三层校验全部匹配
但还不能高兴。接下来是四个没想到的坑。
坑 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.com、gateway.icloud.com、setup.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 个工作日
时间内容耗时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— 查守护进程 CPUdig +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_modulessed -i.bak 's|旧路径|新路径|g'— 批量改路径(带 .bak 备份)
结语
以前觉得 iCloud 是云服务,默认开启总是好的。
现在知道,一个默认开启的"好意",可以让一个专业开发者连续 3 天无法工作。
平台的默认值设计,决定了多少普通用户会在某个意想不到的角落踩坑。
希望这篇文章能帮到你。
如果你已经把项目放 Desktop 了——今天就搬。
2026 年 4 月 19 日,于 ~/Code/Final-OPB/(终于)