在每月最后一个星期一运行的 cron 任务

在每月最后一个星期一运行的 cron 任务

我需要在每个月的最后一个星期一启动一些 cron 脚本。

我想知道组合范围是否可以完成这项工作,例如:

8 04 19-26  *  2     $HOME/bin/mailstub

我希望我做对了,并且我的 cron 作业只会在每个月 19 日至 26 日之间的一周运行一次。

很高兴听到人们的评论,

我正在使用 CentOS 5.6 - 因此某些地方(例如 Wikipedia)提到的 L 构造在我的系统上不起作用。

提前致谢,

盎司

答案1

设置为每天多次。您需要:

0 8 04 19-26 * * 星期一 $HOME/bin/mailstub

该闹钟将在每年任意月份的 19 日至 26 日之间的任意一天的 8:04:00 响起。

但是,如果 19 日是星期一,则 26 日就是星期一。因此,您希望在 19-25 之间进行

0 8 04 19-25 * * 星期一 $HOME/bin/mailstub

因此,这应该每月在星期一触发一次。但是,不能保证(或很可能)是最后一个星期一。如果您需要它是最后一个,并且 L 语法不起作用,则需要将逻辑编程到被调用的脚本中。这很容易用 python 完成,但超出了这个问题的范围。

答案2

您的 cron 作业将在星期二(第 5 个字段,星期几,0 或 7 为星期日)运行,而不一定在每月的最后一个星期二运行。最好使用:

8 04 * * 1 [ $(date +"\%m") -ne $(date -d 7days +"\%m") ] && $HOME/bin/mailstub

检查今天的月份是否不等于 7 天后的月份。如果不相等,则为该月的最后一个星期一。

答案3

您可以使用以下内容:

周一:

30 10 25-31 1,3,5,7,8,10 * test $(date +\%w) -eq 1 && cmd每个月 25 日至 31 日(31 天)的星期一上午 10:30

30 10 24-30 4,6,9,11 * test $(date +\%w) -eq 1 && cmd每月 24 日至 30 日期间的每个星期一上午 10:30

30 10 22-29 2 * test $(date +\%w) -eq 1 && cmd2 月 22 日至 29 日期间每周一上午 10:30

周三:

30 10 25-31 1,3,5,7,8,10 * test $(date +\%w) -eq 3 && cmd每个月 25 日至 31 日(31 天)的星期三上午 10:30

30 10 24-30 4,6,9,11 * test $(date +\%w) -eq 3 && cmd30 天内第 24 至第 30 个月之间的每个星期三上午 10:30

30 10 22-29 2 * test $(date +\%w) -eq 3 && cmd2 月 22 日至 29 日,每周三上午 10:30

答案4

我也遇到过这种情况。通过cron,我无法在每个月的最后一个星期一运行。我通过 Python 做到了这一点。

from datetime import datetime, timedelta
import os

today=datetime.today()
d7d=today+timedelta(days=7)

if today.month != d7d.month:
   os.system('sh /path to shell script')

cron 标签条目如下所示:

0 0 * * 1 /usr/bin/python3 /home/pythonfile.py

这里我安排了一个 Python 文件每周一执行,但是 shell 脚本只在每月的最后一个星期一执行。

由于这种逻辑:if today.month != d7d.month

在这里,我在当前日期上添加七天,并检查月份是否不同。

例如:7 月 20 日是星期一,我们通过 cron 安排的 .py 在这一天将被执行。

20 - jul  = monday
     +7 days
27 - jul  = monday 

这里比较了月份。如果月份相同,则忽略 Python 文件中写入的逻辑。Python 脚本将在 7 月 27 日执行

27 - jul = monday
   +7 days
03 - Aug = monday

现在月份不同了,所以我们的代码将被执行。它里面的 shell 脚本将被执行。

相关内容