# 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
# ! /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
10条答案
按热度按时间hsvhsicv1#
你可以把这样的东西放在盒子里
crontab
文件:这个
date +%d
提供当前日期的数字,然后可以检查该日期是否小于或等于7。如果小于或等于7,请运行命令。如果仅在星期日运行此脚本,则应意味着它仅在每月的第一个星期日运行。
请记住,在
crontab
文件的格式选项date
命令应该转义。lndjwyie2#
值得注意的是,解决这个问题最明显的方法是无效的。
您可能认为可以编写一个crontab条目,将一周中的某一天指定为0(对于星期日),将一个月中的某一天指定为1-7,如下所示。。。
... 但是,由于cron在处理crontab行时同时指定了一周中的某一天和一个月中的某一天,这是不正常的,事实上,它将在一个月的第一、第二、第三、第四、第五、第六和第七天(无论是哪一天)以及每月的每个星期日运行。
这就是为什么建议使用
[ ... ]
核对date
要设置这样的规则,请在crontab中指定星期几并使用[
及date
在运行脚本之前检查月日是否<=7,如接受的答案所示,或在crontab中指定月日范围并使用[
及date
要在跑步前检查星期几,请执行以下操作:如果您希望确保无论在什么操作系统上使用crontab行,都能正常工作,请记住一些最佳做法:
使用
=
不==
,以作比较。它更具可移植性,因为并非所有shell都使用[
这支持了==
操作人员使用
%u
说明符date
以获取星期几作为数字,而不是%a
接线员,因为%a
根据区域设置提供不同的结果date
正在磨合。只用
date
不/bin/date
或/usr/bin/date
,自date
实用程序在不同的系统上有不同的位置。nmpmafwu3#
您需要结合两种方法:
a) 使用
cron
在每个星期天上午9:00运行作业。b) 年初
once_a_week
,通过shell、python、c/c++、…计算日期并提取月份的日期。。。测试范围为1到7(含1到7)。如果是,执行真实脚本;如果没有,请悄悄退出。bejyjqdl4#
黑客解决方案:让你的cron作业每周日运行一次,但是让你的脚本在开始时检查日期,如果一个月的某一天>7,就立即退出。。。
baubqpgj5#
这也适用于工作日的名称:
但是
[ "$(date '+\%a')" == "Sun" ] && echo SUNDAY
由于在crontab中对“%”进行特殊处理,将在comandline上失败(也适用于https://stackoverflow.com/a/3242169/2919695)os8fio9y6#
运行cron任务第一个星期一,第三个星期二,上个星期天,任何。。
http://xr09.github.io/cron-last-sunday/
把钥匙放好
run-if-today
在路径中编写脚本并与cron一起使用。这个
run-if-today
如果日期正确,脚本将只返回0(bash值为true)。编辑:
现在有了更简单的界面,周数只有一个参数。
lnlaulya7#
可能使用cron.hourly调用另一个脚本。然后,该脚本将检查是否是本月的第一个星期日和上午9点,如果是,请运行您的程序。对我来说,听起来已经足够完美了:-)。
xggvc2p68#
如果您不希望cron每天或每个星期天运行您的作业,您可以编写一个 Package 器来运行您的代码,确定下一个第一个星期天,并将其自身安排在该日期运行。
然后把 Package 纸安排在这个月的下一个第一个星期天。之后,它将自行处理一切。
代码应该是这样的(强调某些东西…没有进行错误检查):
找到下一个第一个星期天的逻辑很简单。由于我们从本月的第一个星期日开始,添加28将使我们处于本月的最后一个星期日或下个月的第一个星期日。如果是本月,我们将增加到下一个星期日(即下个月的第一周)。
我用了“at”。我不知道那是不是作弊。不过主要的想法是找到下一个第一个星期天。此后,您可以替换任何您想要的计划程序,因为您知道要运行作业的日期和时间(不过,不同的计划程序可能需要不同的日期语法)。
x6yk4ghg9#
试试下面的方法
0 15 10 ? * 1#1
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger
9bfwbjaz10#
00 09 1-7*0/usr/local/bin/每周一次
每月前7天的每个星期日