macos文件系统实时监控核心是fsevents机制,非轮询;fs_usage可抓取底层读写行为,fswatch响应目录变更,stat循环追踪大小变化,三步法快速定位异常写入源。

MacOS 文件系统实时变化监控,核心是利用系统原生事件机制(FSEvents)捕获文件创建、修改、删除等动作,而不是靠轮询。终端命令组合能帮你精准定位谁在改什么、何时改、改了多大。
用 fs_usage 实时抓取底层文件操作
这是最接近内核的监控方式,显示每个进程对磁盘的实际读写行为:
- 运行 sudo fs_usage -w -f filesys:持续输出所有文件系统调用,含路径、操作类型(write、read、getattr)、数据量
- 加过滤更聚焦:sudo fs_usage -w | grep -E "(write|open|unlink).*/path/to/watch"
- 监控特定进程更省资源:sudo fs_usage TextEdit 或 sudo fs_usage -p 1234
- 注意:需管理员权限;加 -e fs_usage 可排除自身日志干扰
用 fswatch 监控目录树变更事件
fswatch 是专为 macOS FSEvents 优化的轻量工具,响应快、误报少:
- 安装后运行:fswatch -o /Users/you/Documents,每有变动就打印一行路径
- 配合 shell 命令做响应:fswatch -o ~/Downloads | xargs -n1 -I{} echo "新文件:{}" | say
- 监控多个目录:fswatch ~/Projects ~/Backups
- 设延迟避免抖动:fswatch -l 0.5 /tmp(0.5 秒合并事件)
用 stat + 循环实现秒级大小变化追踪
当需要观察单个文件或小目录的体积增减(比如克隆后是否悄悄膨胀):
- 写个简易循环:while true; do stat -f "%z bytes — %Sm" -t "%H:%M:%S" /path/to/file; sleep 1; done
- 对比 inode 判断是否还是克隆:stat -f "%i %z" file1 file2,inode 相同且大小一致,说明尚未触发写时复制
- 搭配 df -h / 每秒刷新,可同步看到根卷可用空间是否同步下降
快速定位异常写入源的三步法
发现磁盘空间突降或风扇狂转时,按顺序排查:
- 查哪个进程在猛写:sudo fs_usage -w | grep "write.*data" | head -20,看 COMMAND 列高频出现的程序名
- 查该进程当前打开的文件:lsof -p PID | grep -E "\.log$|\.tmp$|\.sparseimage$"
- 查它是否在往 APFS 克隆体里写:ls -i /path/to/original /path/to/copy,若 inode 已不同,说明 CoW 已启动,正在分配新块











