如何判断Time Machine备份是否正在运行以避免中断备份?
解决APFS快照清理与Time Machine备份冲突的问题
我之前也踩过这个坑!APFS自动生成的快照悄咪咪占满硬盘,一开始也是写了cron脚本跑tmutil deletelocalsnapshots清理,结果好几次把正在进行的Time Machine备份搞中断了,太头疼了。后来摸索出几个更靠谱的办法,分享给你:
1. 用隐藏的tmutil命令判断备份状态
Apple其实给tmutil藏了几个没写进手册页的实用命令,用来判断备份状态刚好合适:
tmutil currentphase:会返回当前备份的阶段,比如BackupNotRunning就代表没有备份在执行,要是返回PreBackup、Copying这类值,说明备份正在进行中。tmutil isbackuprunning:更直接,返回0代表备份在运行,1代表没在运行。
你可以把脚本改成这样,先判断再执行删除:
# 检查是否有备份在运行 if tmutil currentphase | grep -q "BackupNotRunning"; then # 批量删除所有本地快照 SNAPSHOTS=$(tmutil listlocalsnapshots / | awk -F '.' '{print $4}') for SNAP in $SNAPSHOTS; do echo "正在删除快照:$SNAP" tmutil deletelocalsnapshots $SNAP done else echo "Time Machine正在备份,跳过本次快照清理" exit 0 fi
2. 别再靠挂载点判断了,它有局限性
你之前用/Volumes/Time Machine Backups/挂载情况判断的问题在于:Time Machine的本地快照备份是不会生成这个挂载点的,这时候脚本会误判成没有备份在运行,删快照直接中断本地备份。用上面的tmutil命令就完全没这个问题。
3. 更省心的方案:让系统自动清理快照
其实不用手动写脚本,你可以修改系统配置,限制APFS自动快照的保留时间,让系统自己清理旧快照:
- 查看当前本地快照保留天数:
defaults read /Library/Preferences/com.apple.TimeMachine.plist LocalSnapshotRetentionInterval - 修改为保留2天(根据自己需求调整):
sudo defaults write /Library/Preferences/com.apple.TimeMachine.plist LocalSnapshotRetentionInterval -int 2 - 重启Time Machine服务生效:
sudo launchctl stop com.apple.backupd && sudo launchctl start com.apple.backupd
这样系统会自动删除超过保留天数的快照,完全不用你操心,也不会和备份冲突。
最后提醒一句:删除快照时尽量用批量删除的方式,别手动指定日期,避免漏删或者误删正在使用的快照哦。
内容的提问来源于stack exchange,提问作者Grzegorz Adam Hankiewicz




