13 cron
对于 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
Run Code Online (Sandbox Code Playgroud)
我想知道的是,当我们设置月份的第31天时,这是否意味着每个月的结束,尽管该月没有第31天。希望得到答案。
提前致谢
Tom*_*son 22
不,31 表示 31。
但是,你可以做一些诡计。将作业设置为在可能是该月最后一天的任何一天运行(即,在 day-of-month 字段中的 28-31),然后将您的命令替换为一个 shell 表达式,该表达式包含对保护日期的测试命令:
0 0 28-31 * * [ "`date +%m`" != "`date --date=tomorrow +%m`" ] && command
Run Code Online (Sandbox Code Playgroud)
测试括号内的表达式只是询问今天的月份数与明天的月份数是否不同,这当然只会在该月的最后一天为真。请注意,此表达式的形式取决于您的本地date- 如果您没有当前的 GNU 版本,则可能需要对其进行调整。
我应该说这不是我发明的 - 我在 Matthew Jarvis 的邮件列表帖子中通过快速谷歌找到了它。不过,我认为这是一个标准的旧 Unix 向导的技巧。
Pau*_*xon 13
不,我认为你能做的最好的事情是在每月 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
Run Code Online (Sandbox Code Playgroud)