我想每周五晚上进行一次备份(不,这不是整个备份程序,只是其中的一部分)。每周五晚上的备份直到 4 周后才会被覆盖。因此,本质上,我有四个循环备份:第 1 周、第 2 周、第 3 周和第 4 周。
现在,我需要每 4 周运行一次 week1 备份脚本。但我还希望每 4 周运行一次 week2 脚本。我知道我可以告诉 crontab 每 X 周/天/小时/等等执行某项操作。但是,我该如何设置它,以便这四个脚本实际上在不同的星期运行,我如何避免所有 4 个脚本在同一个晚上运行,然后恭敬地等待几周才全部再次运行?
答案1
与其设计如此复杂的备份程序,不如考虑使用 Bacula,它是一款企业级免费开源软件。Bacula 非常灵活,几乎可以以您想要的所有方式自动执行备份任务。
即使你能够做出手动解决方案,它也存在许多缺点:
- 跟踪错误将是一个大问题
- 追踪工作将会很麻烦
- 手动设置始终需要持续监控
最好的系统管理员是能够自动化所有事情,然后自己就可以放松下来的人。
答案2
我认为 Frank 的回答是最好的,但要按照你描述的方法,你可以使用 cronjob 每周五进行备份,然后使用 log rotate 保留最后四份副本。或者使用 find 查找任何超过四周的备份。
答案3
另一种选择是:将复杂性放入脚本中,因为它比 cron 更能处理这种复杂性。因此(假设是 bash):
- 让你的 cron 作业每周五运行相同的脚本。
- 修改脚本,以便得到自纪元以来周数的模数 4:
(愚蠢的格式问题,需要在这里放置虚拟文本)
epochsecs=`date +%s` # second since epoch
和
weeknum=`expr $epochsecs / 86400 / 7 % 4` # weeks since epoch, modulo 4
使用该号码作为备份文件名的一部分。
备份文件=/路径/到/备份/文件.$weeknum
覆盖旧的备份文件。
rm $备份文件 tar czvf $备份文件 /bunch/of /目录
或者,只需使用带有日期的文件名后缀:
backupfile=/path/to/backup/file.`date +%Y-%m-%d`
然后在脚本中运行查找,将删除超过 28 天的备份文件:
find /path/to/backup -maxdepth 1 -ctime +28 -delete
无论如何,不要让 cron 承担过多的复杂性。在脚本中处理它,它可能能够更好地处理复杂性。