31 是否一定意味着 Cron 工作的月底?

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 向导的技巧。

  • 在 stackexchange 网站上,提出一个可以用谷歌搜索回答的问题并不是一件坏事。事实上这是一件好事,因为下一个在谷歌搜索这个的人会在stackexchange上找到答案并来到这里。 (4认同)
  • 考虑到 GNU 特定的“日期”选项,它不会太老了 =) (2认同)

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)

  • 我没有使用 cron 的经验,但是“0 0 28,29 2”不会在闰年执行两次吗?并不是说这会成为未来两年的问题,但仍然...... (8认同)

Dav*_*ebb 5

我认为你不能轻易做到这一点crontab.

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