对于cron工作,我们知道我们可以设置时间如下。
# +------------ Minute (0 - 59) # | +---------- Hour (0 - 23) # | | +-------- Day of the Month (1 - 31) # | | | +------ Month (1 - 12) # | | | | +---- Day of the Week (0 - 7) (Sunday is 0 or 7) # | | | | | # * * * * * command
我想知道的是,当我们设定了31个月的日子,这是否意味着每个月的结束,尽pipe月份没有31日。希望得到答案。
提前致谢
不,31意味着31。
但是,你可以做一些欺骗手段。 将作业设置为可能在每个月的最后一天(即月份的28-31天)的任何一天运行,然后用一个shellexpression式replace您的命令,该expression式包含守卫命令:
0 0 28-31 * * [“ date +%m ”!=“ date --date=tomorrow +%m ”] && command
testing方括号内的expression式只是询问明天的月份号码是否与明天的月份号码不同,当然这只在月份的最后一天才是真实的。 请注意,这个expression式的forms取决于你的本地date – 如果你没有当前的GNU版本,你可能需要调整它。
我应该说,我没有发明这个 – 我发现它与一个快速的谷歌(原来的海报应该做自己,坏海报!)在马修贾维斯邮件列表张贴。 不过,我可以想象这是一个标准的老的unix巫师的伎俩。
不,我认为你可以做的最好的是在本月1日的午夜时分运行,或者每月设置单独的crontab行(或者至less28,29,30和31天的一个月)
0 0 28,29 2 * /my/command 0 0 30 4,6,9,11 * /my/command 0 0 31 1,3,5,7,8,10,12 * /my/command
我不认为你可以在crontab轻松做到这一点。
一种select是设置cron来每天运行脚本,然后让脚本自己检查是否是月份的最后一天。
我猜cron有一个特殊的字符'L'意思是为了这个目的:
* * L * * your_script.sh
会在每个月的最后一天执行您的脚本
另一方面,
* * 0 * * your_script.sh
你甚至可以指定类似的东西:
* * * * 1,5L your_scrript.sh
在每个月的最后一个星期一和星期五运行脚本
要么
* * * * 1 your_script.sh
在每个星期一午夜运行脚本。
这将完成这项工作:
if [ $( date +%-d --date="tomorrow" ) -eq 1 ] then echo Last day of the current month else echo Not yet! exit 0 fi exit 1