希望在每月第一个星期一执行一个脚本,然后在每月第一个星期三执行另一个脚本。
问题是,如果新月份从星期二开始,那么“本月第一个星期三”操作将首先执行。我希望配置为“本月第一个星期三”操作仅在该月内星期一之后执行。
可以使用逻辑从脚本的角度来解决这个问题,但问题是我需要在 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