我想在每月第一个星期一的 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