![Cron 作业“if-unless”结构?](https://linux22.com/image/602802/Cron%20%E4%BD%9C%E4%B8%9A%E2%80%9Cif-unless%E2%80%9D%E7%BB%93%E6%9E%84%EF%BC%9F.png)
我想使用 cron 设置这个数据库备份例程:
- 每月 1 号进行一次完整备份
- 每周日都进行增量备份 - 除非是第一天
- 每周的每一天都进行增量备份 - 除非是第一天或周日
数据库是 DB2,有人会好奇吗?“完整”表示完整,“增量”表示累积增量,“增量差异”表示“非累积增量”。最坏情况下的恢复方案是“完整 + 增量 + 6 个差异”。
这是我尝试过的:
# monthly
0 0 1 * * ("do full backup")
# weekly
0 0 2-31 * 0 ("do incremental backup")
# daily
0 0 2-31 * 1-6 ("do incremental delta backup")
... 希望第二行的意思是“在周日进行备份,但前提是日期在 2 号到 31 号之间”。事实证明,cron 不会对其时间参数进行 AND 运算,而是对其进行 OR 运算。因此,在 18 日星期二到 19 日星期三之间的午夜,每日和每周备份都已启动,无论当时是否是周日。顺便说一句,每日备份“先进行”,并阻止了每周备份。
现在,我可以调整时间,这样在一天中,每月备份总是在每周备份之前开始,在每日备份之前开始(例如 00.01、00.02 和 00.03),从而利用“阻塞”现象实现我的目标。不过,这很丑陋,而且我时不时会不得不处理实际上不是错误的错误输出(阻塞备份)。
此外,我可以将我的方案完全基于月份日期。但完整备份会严重消耗主机资源,因此我的用户会真的就像在周末运行完整备份。
有什么不需要编写脚本的建议吗?我希望将设置保持在非常基本的水平,以便于将来使用和理解。此外,不同的用户组会需要略有不同的备份策略,我不喜欢编写小差异的脚本。
问候,托尔斯滕
答案1
这个怎么样:
# monthly
0 0 1 * * ("do full backup")
# weekly or daily
0 0 2-31 * * (if test `date +%u` -eq 7 then "do incremental backup" else "do incremental delta backup" )