在 cron 作业中 31 一定意味着月份结束吗?

在 cron 作业中 31 一定意味着月份结束吗?

对于 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 日。

答案1

不,31就是31。

但是,你可以使用一些小技巧。将作业设置为在可能是月份最后一天的任何一天运行(即日期字段中的 28-31),然后将命令替换为包含对日期进行测试的 shell 表达式,该表达式用于保护命令:

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

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

我应该说这不是我发明的 - 我用 Google 快速搜索了一下 Matthew Jarvis 的邮件列表帖子,找到了它。不过,我认为这是典型的老式 Unix 巫师的把戏。

答案2

不,我认为最好的办法是在每月 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

答案3

我认为你不可能在 中轻易地做到这一点crontab

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

答案4

这将完成这项工作:

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

exit 1

相关内容