macos底层文件读写追踪依赖fsevents机制,主要用fs_usage实时捕获系统调用、fswatch监控目录变更、stat观察文件变化,并按高频写入进程→打开文件→克隆状态顺序排查异常源。
开启 macos 底层文件读写追踪,核心是调用系统原生的 fsevents 事件机制,而不是轮询。终端中没有“一键开启”的开关,但有三类命令可按需组合使用:实时抓取、目录响应、秒级变化观察。
用 fs_usage 实时捕获所有文件系统调用
这是最贴近内核的追踪方式,能显示每个进程对磁盘的实际读写行为:
- 运行 sudo fs_usage -w -f filesys,持续输出 open、read、write、unlink 等操作,含完整路径和数据量
- 聚焦特定路径:加管道过滤,例如 sudo fs_usage -w | grep -E "(write|open).*/Users/you/Downloads"
- 监控单一应用更省资源:sudo fs_usage Safari 或 sudo fs_usage -p 1234(PID)
- 建议加上 -e fs_usage 排除自身日志干扰
用 fswatch 监控目录树的变更事件
fswatch 是专为 macOS FSEvents 设计的轻量工具,响应快、抖动少:
- 安装后执行 fswatch -o ~/Documents,每次文件增删改都会输出一行路径
- 配合 shell 做动作响应:fswatch -o ~/Downloads | xargs -n1 -I{} echo "新文件:{}" | say
- 同时监控多个位置:fswatch ~/Projects ~/Backups
- 加 -l 0.5 设置 0.5 秒延迟,合并高频事件,避免重复触发
用 stat 循环观察单个文件或目录的大小变化
适合追踪体积异常增长(如日志膨胀、克隆体写时复制):
- 秒级刷新查看:while true; do stat -f "%z bytes — %Sm" -t "%H:%M:%S" /path/to/file; sleep 1; done
- 判断是否仍是 APFS 克隆:stat -f "%i %z" file1 file2,inode 相同且大小一致才说明未触发 CoW
- 同步看磁盘空间:watch -n1 'df -h /',确认写入是否影响根卷可用空间
快速定位异常写入源的排查顺序
发现风扇狂转或空间突降时,按此流程缩小范围:
- 查高频写入进程:sudo fs_usage -w | grep "write.*data" | head -20,看 COMMAND 列反复出现的程序名
- 查该进程打开的文件:lsof -p PID | grep -E "\.log$|\.tmp$|\.sparseimage$"
- 确认是否在往克隆体写:stat -f "%i %z" target_file original_clone,若 inode 已不同,说明 CoW 已启动,正在分配新块











