我有一个cronjob,其最终目标是在每个月的第一个星期日进行数据库备份(并在此过程中删除上个月的备份)。
这就是我所定义的:
0 1 1-7 * * test `date +\%w` -eq 0 && rm /tmp/firstSundayBackup*; mysqldump -u user -ppassword database > /tmp/firstSundayBackup-`date +\%Y-\%m-\%d`.sql
但是,查看我的/ tmp /文件夹,我会在第一周内看到多个这些备份在非星期天的日子里进行。
不应该
test `date +\%w` -eq 0 && REST_OF_JOB
停止代码在非星期天的任何一天运行?
答案 0 :(得分:1)
不应该
test `date +\%w` -eq 0 && REST_OF_JOB
停止代码在非星期天的任何一天运行?
确实如此,但由于运算符优先级,这仅适用于rm
命令。 mysqldump
无论如何都会继续。
您只需在&&
:
test `date +\%w` -eq 0 && (rm /tmp/firstSundayBackup*; mysqldump -u user -ppassword database > /tmp/firstSundayBackup-`date +\%Y-\%m-\%d`.sql)
作为一个重要的旁边:你的工作每天都会运行,因为你告诉Cron每天都要运行它。有没有什么理由可以解释为什么你这样做然后试图缩短大部分的执行时间,而不仅仅是告诉Cron周日运行它?这似乎是解决这个问题最直观的方法,所以如果您将其安排为:
会出现问题0 1 1-7 * 0
答案 1 :(得分:0)
我认为有可能在没有日期测试的情况下依靠cron的实现中的edge case来实现这一点。试试0 1 1-7 * */7
REST_OF_JOB