我有一个这样的脚本:
* * * * * path/to/my/script.sh
我需要定义 cron 表达式“* * * * * ”来每月第一个星期一运行一次。
最佳答案
每月的第一个星期一是该月前 7 天内唯一出现的星期一。因此,要在凌晨 1:02 执行作业,请使用:
2 1 1-7 * * test $(date +\%u) -eq 1 && path/to/my/script.sh
前两项,数字 1
和 2
,设置分钟和小时。
第三项 1-7
设置该月中某天的允许范围。
第四项,*
,是月份,我们允许所有月份匹配。
第五项,*
,设置星期几。 此字段与月份中的日期字段进行“或”运算。因此,在此指定星期一是没有用的。如果我们这样做,cronjob 将在该月的前 7 天和所有星期一运行。
最后,我们测试 $(date +\%u) -eq 1
。仅在星期一返回 True。由于其后面有 &&
,您的脚本将仅在该月前 7 天内的星期一执行。
请注意,在 crontab 条目中,%
被视为换行符,除非它被转义。因为我们需要一个文字 %
,所以在上面的命令中使用反斜杠对其进行转义。
有关其工作原理的更多信息,请参阅 man 5 crontab
。
替代方案
正如特瓦尔伯格指出的那样,同样的逻辑反之亦然。我们可以在每个星期一运行 cronjob,然后测试该星期一是否是该月的前 7 天之一:
2 1 * * Mon test $(date +\%e) -le 7 && path/to/my/script.sh
关于linux - 如何定义一个 cron 表达式在每个月的第一个星期一执行脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36926476/