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

我在RedHat上使用Bash。 我需要安排一个cron工作,在每个月的第一个星期天上午9:00运行。 我做了一些研究,发现在这个问题上没有简略的手段。

你知道一个最佳的方式吗?

你可以把这样的东西放在crontab文件中:

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

date +%d为您提供当天的号码,然后您可以检查一天是否小于或等于7.如果是,请运行您的命令。

如果您仅在星期天运行此脚本,则意味着它仅在本月的第一个星期日运行。

请记住,在crontab文件中, date命令的格式选项应该被转义。

你需要结合两种方法:

a)每周日上午9:00使用cron来运行一个工作。

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

b)在once_a_week开始时,通过shell,Python,C / C ++,…计算date并提取月份的date,并且testing在1到7之内(包括1和7)。 如果是这样,执行真实的脚本; 如果没有,请静静地退出。

一个黑客的解决scheme:每个星期天都有你的cron作业运行,但是你的脚本在开始的时候检查date,如果这个月的date是> 7,那么立刻退出。

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

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

但,

[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY

由于crontab中的“%”的特殊处理,会在命令行上失败 (同样适用于https://stackoverflow.com/a/3242169/2919695

第一个星期一,第二个星期二,最后一个星期天,什么都可以运行一个cron任务。

http://xr09.github.io/cron-last-sunday/

只需将run-if-today脚本放在path中并使用它与cron即可。

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

如果是正确的date, run-if-today脚本将只返回0(真实的bash值)。

编辑:

现在更简单的界面,只有一个参数为周数。

 # 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 

也许使用cron.hourly来调用另一个脚本。 然后,脚本会检查是否是本月的第一个星期日,上午9点,如果是的话,运行你的程序。 听起来足够优秀,我:-)。

如果你不想每天或者每个星期天都用cron来运行你的工作,那么你可以编写一个包装器来运行你的代码,确定下一个第一个星期天,并计划在这个date运行。

然后安排该包装的月份的下一个第一个星期天。 之后,它将处理所有事情。

代码将是类似的东西(强调的东西…没有错误检查完成):

 #! /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 

逻辑很简单,find下一个第一个星期天。 从本月的第一个星期天开始,增加28将使我们在本月的最后一个星期日或下个月的第一个星期天。 如果是当前月份,我们将增加到下个星期天(这将在下个月的第一个星期)。

我用“在”。 我不知道这是否是作弊。 主要的想法是find下一个第一个星期天。 因为您知道要运行作业的date和时间(不同的调度程序可能需要不同的date语法),所以您可以replace所需的任何调度程序。

00 09 1-7 * 0 / usr / local / bin / once_a_week

每个月的前7天的每个星期天