31是否必然意味着本月底的Cron工作?


13

对于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天时,这是否意味着每个月末,尽管该月没有第31天。希望得到答案。

提前致谢

Answers:


22

不,31表示31。

但是,您可以做一些技巧。将作业设置为可能在一个月的最后一天运行的任何一天(例如,“ day-of-month”(月日)字段中的28-31),然后将您的命令替换为包含表达式的shell表达式,其中包含在保护日期的测试命令:

0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command

测试括号内的表达式只是询问今天的月份号是否与明天的月份号不同,当然,这只在该月的最后一天才适用。请注意,该表达式的形式取决于您的本地date-如果您没有当前的GNU版本,则可能需要对其进行调整。

我应该说不是我发明的-我是由马修·贾维斯(Matthew Jarvis)在邮件列表中的快速Google上找到的。我可以想象,这实际上是一个标准的旧Unix向导的把戏。


1
它不能太旧给出的GNU特定的选项为“日期”一招=)
jj33

4
在stackexchange网站上,提出可以通过Google搜索回答的问题并不是一件坏事。实际上,这是一件好事,因为下一个要在Google中进行搜索的人将在stackexchange上找到答案并来到这里。
miernik

12

不,我认为您最好的方法是在每月的1号午夜运行,或为每个月设置单独的crontab行(或至少在28、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

谢谢保罗!我将遵循第二个。对于第二种方法,我需要将同一文件设置三遍吗?再次感谢:)

是的,您需要重复一遍。
Paul Dixon

7
我没有使用cron的经验,但是“ 0 0 28,29 2”会不会在year年执行两次?并不是说这将在未来两年内成为问题,但仍然...
Wim十Brink

这是一个好点,没有轻松的方法
Paul Dixon

4

我认为您无法在Windows中轻松完成此操作crontab

一种选择是设置cron为每天运行脚本,然后使脚本本身检查是否是该月的最后一天。


3

我猜cron为此有一个特殊字符'L':

*    *    L    *    *    your_script.sh 

会在每个月的最后一天执行您的脚本

另一方面,

*    *    0    *    *    your_script.sh

您甚至可以指定以下内容:

*    *    *    *    1,5L    your_scrript.sh

在每个月的最后一个星期一和星期五运行脚本

要么

*    *    *    *    1    your_script.sh

在每个星期一的午夜运行脚本。


0

这将完成工作:

if [ $( date +%-d --date="tomorrow" ) -eq 1 ]
then echo Last day of the current month
else echo Not yet!
     exit 0
fi

exit 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.