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

Max*_*ams 41 cron crontab

我想在每个月的第一个星期一 8.30 从 cron 运行一项工作。cron 维基百科页面说

而当时间/日期规范领域的所有匹配当前时间和日期执行正常的工作,有一个例外:如果“月日”和“星期几”的限制(而不是“*”),那么无论是“日期”字段 (3) 或“星期几”字段 (5) 必须与当前日期匹配。

(我的重点)

这是否意味着我不能在一个月的第一个星期一做,我只能在一个月的第一天(或其他任何一天)做?我想不出办法绕过它。

slh*_*hck 50

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

[ "$(date '+%u')" = "1" ] && echo "It's Monday"
Run Code Online (Sandbox Code Playgroud)

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

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

echo命令替换为您要运行的实际命令。我也找到了类似的方法

  • 我发现了问题 - `+%a` 中的百分比在 crontab 中时需要转义,即该行需要是这样的:`[ "$(date '+\%a')" = "Mon" ] &&回声“今天是星期一”`。如果您可以更新您的答案,这将对未来的读者有所帮助:) 再次感谢 - 最大 (2认同)

小智 24

我有一台语言环境为西班牙语的计算机,因此,这种方法对我不起作用,因为mon更改为lun

其他语言也会失败,因此,我对消除语言障碍的公认答案做了一些改动:

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


小智 10

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

运行每月的第一个星期一:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command
Run Code Online (Sandbox Code Playgroud)

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

同样,对于第三个星期五

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command
Run Code Online (Sandbox Code Playgroud)

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


kra*_*r65 7

由于我使用 php 和 js 解释 cron 语句,因此我无法使用 bash。最后我发现实际上只用 cron就可以实现:

0 30 8 * 1/1 MON#1
Run Code Online (Sandbox Code Playgroud)

希望这对其他人有帮助。无论如何,我祝大家度过美好的一天。:-)


小智 5

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

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