每月第一个星期一运行一个 cron 作业?

每月第一个星期一运行一个 cron 作业?

我想在每月第一个星期一的 8:30 从 cron 运行一项任务。cron 维基百科页面显示

虽然通常当时间/日期规范字段全部与当前时间和日期匹配时,就会执行作业,但有一个例外:如果“月份中的日期”和“星期几”都受到限制(而不是“*”),那么任何一个“月份中的日期”字段 (3) 或“星期几”字段 (5) 必须与当前日期匹配。

(我强调)

这是否意味着我不能在每月的第一个星期一做,而只能在每月的第一天(或任何一天)做?我想不出解决办法。

答案1

您可以将条件放入实际的 crontab 命令中(通用方式):

[ "$(date '+%u')" = "1" ] && echo "It's Monday"

如果您的语言环境是 EN/US,您还可以比较字符串(初始答案):

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

现在,如果该条件在一个月的前七天中的某一天为真,则您将得到该月的第一个星期一。请注意,在 crontab 中,百分比语法需要转义(通用方式):

0   12  1-7 *   *   [ "$(date '+\%u')" = "1" ] && echo "It's Monday"

如果您的语言环境是 EN/US,您还可以比较字符串(初始答案):

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

将命令替换echo为您要运行的实际命令。我发现了一个类似方法也。

答案2

我有一台西班牙语的电脑,所以这种方法对我来说不起作用,因为星期一更改为

其他语言也会失败,因此,我对接受的答案做了一些细微的改动,以消除语言障碍:

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

答案3

当不需要处理日期数字时,我发现它更容易。

每月第一个星期一运行:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

即,如果一周前的月份与当前月份不同,那么我们就处于该月的第一天(=星期一)。

同样,第三个星期五

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

即,如果 3 周前的月份与当前月份不同,那么我们就处于该月的第 3 天 6(=星期五)

答案4

我已安排一项工作在每月第四个星期一下午 4:00 运行,如下所示:

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

相关内容