使用 crontab 定时备份数据

2024-03-03 Views backup crontab tech

最近优化了一下数据备份的流程,尝试把一些步骤使用 crontab 自动化起来。

我一直有定期备份数据的习惯,备份的具体流程也在不断迭代,前段时间把一部分备份步骤写成了脚本,定期通过快捷键调用,这两天觉得手动调用的这一步也可以自动化,所以想到了 crontab。
之前只在使用 GitHub Action 的时候接触过 crontab,没有太具体了解过,所以打算这次也一并实践一下。
原来的数据备份流程如下:

  1. 运行一个脚本,脚本执行以下内容:
    1. 运行brew dump 导出Brewfile到根目录;
    2. 连同根目录下的其他值得备份的文件,一起上传到指定地点;
    3. 根据日期创建文件夹,把前述的Brewfile和其他值得备份的文件放进去;
  2. 手动导出 bitwarden 和 raycast 的数据到前面创建的文件夹;
  3. 把文件夹复制到移动硬盘里;

这个流程除了最后两步需要手动操作,前面的脚本部分每次通过快捷键调用一下,也是这一次优化的主要部分。

初步思路是写一个 cron 配置,定时执行备份脚本,例如这样:

14 12 * * 0 /path/to/backup.sh

为了测试,把时间设置为下一分钟,结果过了一会没动静,搜索了一下,可能是权限问题,这个好说,简单处理了一下,更新 cron 配置再来,但还是啥也没有。
这时候我有两个问题:

  1. 脚本有没有按照预期运行?
  2. 如何验证运行结果?

前一个容易验证,关键是后一个,我又看了一下设置日志输出的方法,将 cron 表达式调整为:

14 12 * * 0 /path/to/backup.sh >> /path/to/backup.log 2>&1

更新时间后等了一会,还是什么都没有,我眉头一皱,有点不对劲。又到网上冲了一会浪,决定试试重启电脑。
重开后先进终端检查一下 cron 配置对不对,结果一打开终端发现有个提示:

you have mail

这是啥?为啥会在这里?如果是电子邮件为啥不到我邮箱?
疑问过后还是得挨个分析,首先我的疑问点如下:

  1. 这个显然是提示我有mail,但是这个 mail 去哪里看?检查了邮箱并没有;
  2. 既然是mail,能不能配置自己邮箱接收?

疑问归疑问,我的主线任务仍然是 cron 配置的问题,这个you have mail的问题可以后面再说。
不过沿着这条线研究了一会,发现了 cron 的输出信息是以 mail 的写入到了 /var/mail/[username]这个文件里,并在终端进行提示。(这是系统默认的程序运行输出机制,后面又去补了一下课)

有了输出信息,事情就踏上了快车道,可以根据输出信息一步一步调试了,下面简述一下遇到的问题以及解决方案

问题 解决方案
operation not permitted full-disk permission ( asked in modal)
brew command not found 配置环境变量
add PATH but no path is different for m1 mac

最后的一些问题解决起来比较常规,基本是一些程序执行上的权限问题,因为 cron 在运行脚本时的环境和自己手动运行是不一致的,这个也需要补一下操作系统的课。

(这里补充一下前面关于 you have mail 的信息,可以通过在根目录下新建一个.forward文件来对 /var/mail/[username] 里的邮件执行自动转发,注意.forward文件应该只包含邮箱地址)

最后,总结一下。这次升级简化了备份流程,顺便也提高了自动备份的频率,中途遇到了一些意料之外的操作系统和权限的问题,中途一度毫无头绪,不过最后还是顺利解决了。

赏 支付宝扫码打赏 微信打赏

△