如何为第一周、第二周和第三周以及一周中的特定日期安排 cron?

如何为第一周、第二周和第三周以及一周中的特定日期安排 cron?

我正在尝试安排一个 cron,如果一个月有 5 周和 5 个星期三,脚本A.sh应在第一周星期三、第二周星期三、第三周星期三和第四周星期三运行,而在第五周星期三则应运行b.sh

别的

我正在尝试安排一个 cron,如果一个月有 4 周和 4 个星期三,脚本A.sh应在第一周星期三、第二周星期三、第三周星期三运行,而在第四周星期三则应运行b.sh

答案1

原始问题的原始答案。

你需要这样的东西:

0 1 1-21 * * [ $(date +\%u) -eq 3 ] && "call your command/script here"

此计划0 1 1-21 * *意味着“从 1 日到 21 日,每天凌晨 01:00 运行作业”;现在的问题是,为什么我们要限制在 1-21 日?答案是因为在最好的情况下,该月的 1 天已经是从周三开始(所以我们选择1) 且 crontab 将在每月的1、8和 15运行;

在最坏的情况下,这将是第一周的最后一天(第 7 天),因此 crontab 将在 7、14和7 日运行21该月的第3天;这就是为什么我们将运行天数限制为每月 1~21 天。

但随后man -s 5 crontab说道:

注意:命令执行的日期可以由两个字段指定 - 月份中的某一天和星期几。如果两个字段都受到限制(即不以 * 开头),则该命令将在以下情况下运行任何一个字段与当前时间匹配。

这就是为什么我们只选择月份中的某一天并用 * 表示星期几:

crontab 作业

我们不是像上面指出的那样在 crontab 中指定星期几,而是通过执行简单的操作来处理它test通过外壳[ $(date +\%u) -eq 3 ];检查星期几是否是一周的第三天,即是否是星期三; (星期几的 0-6,0 Mon,...,6 Sun)然后执行命令/脚本。


回答现在修订的问题。

0 1 * * 3 [ $(date +\%m) -eq $(date -d'+7days' +\%m) ] && scriptA.sh || scriptB.sh

如果不是最后一个星期三([ $(date +\%m) -eq $(date -d'+7days' +\%m) ],我们要检查今天的星期三$(date +\%m)+7 天后(下一个星期三的月$(date -d'+7days' +\%m))是否在同一个月,所以这不是最后一个星期三,那么 scripA.sh 将被执行,否则是最后一个星期三,scriptB.sh 将被执行。

如上所述,scriptA.sh 将在该月的每个星期三执行,最后一个星期三除外,然后 scriptB.sh 将执行。

当然,人们可以将这些测试移至 script[AB].sh 内,而不是使 crontab 条目中的事情变得复杂。

注意:上述解决方案也可以通过删除该部分来应用于执行单个commnad/脚本|| scriptB.sh,或者可以用它替换它,以防|| true您也不希望 cron 通过MAILTO在失败情况下通知错误来对其做出反应。

相关内容