我需要在每个月的最后一个星期一启动一些 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 && cmd
2 月 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 && cmd
30 天内第 24 至第 30 个月之间的每个星期三上午 10:30
30 10 22-29 2 * test $(date +\%w) -eq 3 && cmd
2 月 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 脚本将被执行。