简短回答:查看备份中最新文件的日期,而不是文件夹的日期。文件夹的时间戳会因为各种与备份完成毫不相干的原因而改变。
如果其中最新的文件比昨天还旧,那么无论工具怎么说,备份都没有在运行。
大多数备份建议针对的都是错误的灾难。它们设想的是戏剧性的场面:磁盘损坏、笔记本被盗、发洪水。这些很少见,而且人人都明白。
最常见的情况很平淡。驱动器被拔下来给别的东西腾地方,就再也没插回去。NAS 在停电后重启,共享没有重新挂载。整整一个月,每晚任务该运行的时候笔记本都合着。一个脚本带着错误退出,没人看到,因为没人会去读一份一年来都正常的日志。
以上每种情况都没有任何东西坏掉。在任何人会看的地方都没有报错。备份文件夹还在,里面仍然满是文件,大小也没问题。唯一的变化是它不再更新了,而系统中没有任何东西认为这值得一提。
把它指向你的备份目标。它会找出其中任意位置最近修改的文件,并打印其日期:
find /Volumes/Backup -type f -print0 | xargs -0 stat -f '%m %N' | sort -rn | head -5
第一列是 Unix 时间戳。要直接读取它:
find /Volumes/Backup -type f -newermt '-2 days' | head
如果什么都没打印,说明两天内没有写入任何内容。这就是答案,而且比任何状态界面都可信,因为它是文件本身的属性。
具体到 Time Machine:
tmutil latestbackup
它会打印最新快照的路径,名称中带有日期,如果没有快照则会报错。
人们的本能是在 Finder 中查看备份文件夹,读“修改日期”那一列。那个数字并不是你以为的意思。
目录的修改时间在其中添加或删除内容时才会改变,其中文件的内容改变时并不会。Spotlight 索引、.DS_Store 被重写、杀毒软件扫描、云客户端修改自己的元数据:其中任何一种都能让一个早已过时的备份文件夹看起来像是今天早上刚写入过。
里面的文件才是记录,文件夹不是。
StartCalendarInterval 的 launchd 任务在 Mac 睡眠时不会运行,除非你特别要求,否则事后也不会补跑。一台在午夜合上的笔记本,它的午夜备份一次也没发生过。launchd 任务把抱怨写进一个文件,而这个文件是唯一知情的东西。如果你自己动手,解决办法是“死人开关”:在备份没有发生时发出抱怨的东西。这与备份失败是不同的事件,只有前者能覆盖上述情况。
最简单的做法是一个检查最新文件年龄的任务,太旧了就发出警报:
if [ -z "$(find /Volumes/Backup -type f -newermt '-2 days' 2>/dev/null | head -1)" ]; then
osascript -e 'display notification "No backup in two days" with title "Backup"'
fi
让它按自己的计划运行,与备份分开,这样备份计划坏了,也不会连带监视它的东西一起坏掉。人们常在最后这一点上出错:在备份任务内部运行的检查,无法报告备份任务没有运行。
你真正想要的是:缺失本身就是警报,并且工具会指出缺失的是什么。
Copy Shelter 正是基于这一点打造的。它记录每个备份目标上次写入和上次检查的时间,在七天没有成功备份后就会提醒你。它会指出具体位置,所以你会看到“抽屉里那块驱动器自 8 月 14 日起就没再出现过”。而且因为它会读回备份,并按存储时的哈希值核对每一块数据,所以一份在运行却产出无法读取内容的备份也会被发现,那是比本页所讲再进一步的故障。
它显示的分数只计算最近验证过的内容。没有运行的备份不算你拥有的备份,这个数字会如实反映。
你本不该需要手动检查。这正是本页的重点:靠手动执行的检查,你迟早会不再执行,通常在设置后大约三周。把“没有备份”的警报自动化,手动检查留到它提醒你的时候再做。
有帮助,但有限度。Time Machine 在十天没有完成备份后会发出警告,而这条通知很容易被关掉,也很容易被忽视。它也无法告诉你它完成的备份是否无法读取,因为在本地磁盘上它不做检查。
这就是权限问题,而且更棘手,因为每个状态指示都显示成功。比较目标位置和源位置的文件数量。如果一份本应有数万个文件的备份只有四十个,说明 macOS 正在拒绝访问这些文件夹,而任务并没有得到通知。
表现不同,但确实有。同步客户端会退出登录、达到配额上限、自行暂停,而能告诉你这些的标记只是菜单栏里一个你不会去看的小图标。文件也原封不动地留在原处,所以看起来一切正常。
基本上是的。两个会因不同原因出故障、分别检查的备份目标,比对单个目标做再多监控都更有价值。监控告诉你副本没了,而第二份副本意味着这无关紧要。参见 3-2-1 规则。
相关阅读:检查备份是否真的可读,以及 3-2-1 规则。