如何安排每个月的第一个星期日运行

ezykj2lf  于 2021-08-25  发布在  Java
关注(0)|答案(10)|浏览(498)

我正在redhat上使用bash。我需要安排一个cron作业在每个月的第一个星期日上午9:00运行。我该怎么做?

hsvhsicv

hsvhsicv1#

你可以把这样的东西放在盒子里 crontab 文件:

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script

这个 date +%d 提供当前日期的数字,然后可以检查该日期是否小于或等于7。如果小于或等于7,请运行命令。
如果仅在星期日运行此脚本,则应意味着它仅在每月的第一个星期日运行。
请记住,在 crontab 文件的格式选项 date 命令应该转义。

lndjwyie

lndjwyie2#

值得注意的是,解决这个问题最明显的方法是无效的。
您可能认为可以编写一个crontab条目,将一周中的某一天指定为0(对于星期日),将一个月中的某一天指定为1-7,如下所示。。。


# This does NOT work.

0 9 1-7 * 0 /path/to/your/script

... 但是,由于cron在处理crontab行时同时指定了一周中的某一天和一个月中的某一天,这是不正常的,事实上,它将在一个月的第一、第二、第三、第四、第五、第六和第七天(无论是哪一天)以及每月的每个星期日运行。
这就是为什么建议使用 [ ... ] 核对 date 要设置这样的规则,请在crontab中指定星期几并使用 [date 在运行脚本之前检查月日是否<=7,如接受的答案所示,或在crontab中指定月日范围并使用 [date 要在跑步前检查星期几,请执行以下操作:


# This DOES work.

0 9 1-7 * * [ $(date +\%u) = 7 ] && /path/to/your/script

如果您希望确保无论在什么操作系统上使用crontab行,都能正常工作,请记住一些最佳做法:
使用 === ,以作比较。它更具可移植性,因为并非所有shell都使用 [ 这支持了 == 操作人员
使用 %u 说明符 date 以获取星期几作为数字,而不是 %a 接线员,因为 %a 根据区域设置提供不同的结果 date 正在磨合。
只用 date/bin/date/usr/bin/date ,自 date 实用程序在不同的系统上有不同的位置。

nmpmafwu

nmpmafwu3#

您需要结合两种方法:
a) 使用 cron 在每个星期天上午9:00运行作业。

00 09 * * 7     /usr/local/bin/once_a_week

b) 年初 once_a_week ,通过shell、python、c/c++、…计算日期并提取月份的日期。。。测试范围为1到7(含1到7)。如果是,执行真实脚本;如果没有,请悄悄退出。

bejyjqdl

bejyjqdl4#

黑客解决方案:让你的cron作业每周日运行一次,但是让你的脚本在开始时检查日期,如果一个月的某一天>7,就立即退出。。。

baubqpgj

baubqpgj5#

这也适用于工作日的名称:

0 0 1-7 * * [ "$(date '+\%a')" == "Sun" ] && /usr/local/bin/urscript.sh

但是 [ "$(date '+\%a')" == "Sun" ] && echo SUNDAY 由于在crontab中对“%”进行特殊处理,将在comandline上失败(也适用于https://stackoverflow.com/a/3242169/2919695)

os8fio9y

os8fio9y6#

运行cron任务第一个星期一,第三个星期二,上个星期天,任何。。
http://xr09.github.io/cron-last-sunday/
把钥匙放好 run-if-today 在路径中编写脚本并与cron一起使用。

30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh

这个 run-if-today 如果日期正确,脚本将只返回0(bash值为true)。
编辑:
现在有了更简单的界面,周数只有一个参数。


# run every first saturday

30 6 * * 6 root run-if-today 1 && /root/myfirstsaturdaybackup.sh

# run every last sunday

30 6 * * 7 root run-if-today L && /root/lastsunday.sh
lnlaulya

lnlaulya7#

可能使用cron.hourly调用另一个脚本。然后,该脚本将检查是否是本月的第一个星期日和上午9点,如果是,请运行您的程序。对我来说,听起来已经足够完美了:-)。

xggvc2p6

xggvc2p68#

如果您不希望cron每天或每个星期天运行您的作业,您可以编写一个 Package 器来运行您的代码,确定下一个第一个星期天,并将其自身安排在该日期运行。
然后把 Package 纸安排在这个月的下一个第一个星期天。之后,它将自行处理一切。
代码应该是这样的(强调某些东西…没有进行错误检查):


# ! /bin/bash

# We run your code first

/path/to/your/code

# now we find the next day we want to run

nskip=28 #the number of days we want to check into the future
curr_month=`date +"%m"`
new_month=`date --date='$nskip days' +"%m"`
if [[ curr_month = new_month ]] 
then
((nskip+=7))
fi
date=`date --date='$nskip days' +"09:00AM %D` #you may need to change the format if you use another scheduler

# schedule the job using "at"

at -m $date < /path/to/wrapper/code

找到下一个第一个星期天的逻辑很简单。由于我们从本月的第一个星期日开始,添加28将使我们处于本月的最后一个星期日或下个月的第一个星期日。如果是本月,我们将增加到下一个星期日(即下个月的第一周)。
我用了“at”。我不知道那是不是作弊。不过主要的想法是找到下一个第一个星期天。此后,您可以替换任何您想要的计划程序,因为您知道要运行作业的日期和时间(不过,不同的计划程序可能需要不同的日期语法)。

x6yk4ghg

x6yk4ghg9#

试试下面的方法
0 15 10 ? * 1#1
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

9bfwbjaz

9bfwbjaz10#

00 09 1-7*0/usr/local/bin/每周一次
每月前7天的每个星期日

相关问题