![如何为第一周、第二周和第三周以及一周中的特定日期安排 cron?](https://linux22.com/image/191567/%E5%A6%82%E4%BD%95%E4%B8%BA%E7%AC%AC%E4%B8%80%E5%91%A8%E3%80%81%E7%AC%AC%E4%BA%8C%E5%91%A8%E5%92%8C%E7%AC%AC%E4%B8%89%E5%91%A8%E4%BB%A5%E5%8F%8A%E4%B8%80%E5%91%A8%E4%B8%AD%E7%9A%84%E7%89%B9%E5%AE%9A%E6%97%A5%E6%9C%9F%E5%AE%89%E6%8E%92%20cron%EF%BC%9F.png)
我正在尝试安排一个 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 中指定星期几,而是通过执行简单的操作来处理它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
在失败情况下通知错误来对其做出反应。