终端是唯一能穿透进程表层、落到真实文件路径的工具:用lsof查指定进程打开的文件,opensnoop追踪全系统新打开文件,fs_usage深度捕获读写行为与调用栈。

当你发现Mac硬盘指示灯常亮、风扇无故狂转,或想确认某个程序是否在偷偷扫描你的文档、缓存或日志时,需要直接看到“哪些具体文件正被频繁读写”——终端是唯一能穿透进程表层、落到真实文件路径的工具。
用lsof实时抓取某进程正在访问的文件
这方法适用于你已通过活动监视器锁定高IO进程(比如Chrome、mdworker、cloudd),现在要下探到它实际操作的文件。
第一步:在活动监视器“磁盘”页右键目标进程 → 选择“复制PID”,或手动记下PID列数字(如12847)。
第二步:打开终端,执行:
lsof -p 【PID数字】 | grep -E "REG|DIR"
输出中TYPE为REG的行即该进程当前打开的普通文件;含.log、.tmp、.sqlite、.cache等后缀的路径,就是高频读写目标。注意:若进程刚启动或处于空闲状态,可能返回空;建议在它活跃时(如浏览器加载大网页、iCloud同步照片)立即执行。
用opensnoop追踪全系统新打开的文件(无需预设进程)
当你还不知道是谁在捣鬼,只想看“此刻系统里哪些文件正被新打开”,opensnoop最直接——它监听内核vnode_open事件,每行代表一次文件打开动作,不依赖进程状态。
方法一:查看最近10秒所有新打开的文件(轻量,免sudo)
sudo opensnoop -T -n 10
方法二:过滤出读写频率高的文件路径(需持续运行30秒以上)
sudo opensnoop -T | awk '{print $6}' | sort | uniq -c | sort -nr | head -12
这一步会统计30秒内各文件被打开的次数,排在最上面的就是真正被轮番读写的热点文件,比如/Users/xxx/Library/Caches/com.google.Chrome/Cache/data_0、/private/var/folders/xx/yy/C/com.apple.Spotlight/Store.db-wal。
用fs_usage深度捕获读写行为与调用栈
fs_usage比lsof和opensnoop更底层,它记录每一次read、write、open、close系统调用,并附带进程名、线程ID和毫秒级时间戳,适合定位“为什么某个文件被反复读小块数据”这类性能问题。
执行:
sudo fs_usage -w -f filesys | grep -E "(read|write|open).*\.log|\.tmp|\.db"
命令中-f filesys限定只捕获文件系统调用,-w让输出实时滚动;grep过滤常见临时/日志后缀,避免刷屏。当看到某行反复出现相同路径+read(1024)或write(4096),说明该文件正承受大量小尺寸I/O——这往往是日志轮转、数据库WAL写入或同步工具卡住的典型特征。
注意:【fs_usage会持续运行直至你按Ctrl+C终止,不要让它后台挂太久,否则日志体积暴增】。











