Crontab - 该月第一个星期三,然后是该月第一个星期一

Crontab - 该月第一个星期三,然后是该月第一个星期一

希望在每月第一个星期一执行一个脚本,然后在每月第一个星期三执行另一个脚本。

问题是,如果新月份从星期二开始,那么“本月第一个星期三”操作将首先执行。我希望配置为“本月第一个星期三”操作仅在该月内星期一之后执行。

可以使用逻辑从脚本的角度来解决这个问题,但问题是我需要在 cron 表达式中使用它,因为这是我在所使用的系统中安排它的唯一方法(它需要 cron 表达式进行高级调度,并且该系统的细节与这个问题无关)。

编辑:上述由 cron 执行的脚本之间没有依赖关系或关系。为了简单起见,它们只是同一个 crontab 中的两个单独的 cronjob。

答案1

为了在每月第一个星期一运行命令,我crontab最初建议使用以下行:

# m h d o w u cmd
0 3 1-7 * 1 root /usr/local/sbin/kachow

因为八月一日的星期几肯定与一月一日的星期几相同,所以一行crontab同时指定该月的前七天和星期一,希望能够达到初衷,不是吗?

不幸的是,那一crontab行是错的。实际上,kachow脚本会在每个月的前七天以及每个星期一运行。crontab使用OR逻辑将月份的天数和星期几结合起来。crontab (5)手册页提供以下说明:

注意:命令执行的日期可以通过两个字段指定 - 月份日期和星期几。如果两个字段都受到限制(即不是 *),则命令将在以下情况下运行任何一个字段与当前时间匹配。例如,“30 4 1,15 * 5”将导致命令在每个月 1 日和 15 日的凌晨 4:30 以及每个星期五运行。


crontab为了将命令执行限制在每月的第一个星期一,还需要在行的命令部分定义逻辑。因此,以下任何一行都可以按预期工作:

# m h d o w u cmd
0 3 1-7 * * root [ $(date +%u) -eq 1 ] && /usr/local/sbin/kachow
# m h d o w u cmd
0 3 * * 1 root [ $(date +%-d) -le 7 ] && /usr/local/sbin/kachow

类似地,如果脚本预期仅在同一个月的周一之后才在第一个周三运行,则可以通过crontab以下其中一行来安排。我认为应从逻辑中排除该月的 8 日和 9 日;相反,woof-woof脚本会在当月的第二个周三意外运行。

# m h d o w u cmd
0 3 3-7 * * root [ $(date +%u) -eq 3 ] && /usr/local/sbin/woof-woof
# m h d o w u cmd
0 3 * * 3 root [ $(date +%-d) -ge 3 -a $(date +%-d) -le 7 ] && /usr/local/sbin/woof-woof

相关内容