为什么@weekly 会这样工作?说明书错误?

为什么@weekly 会这样工作?说明书错误?

crontab(5) 手册说:

当分钟、小时和月份字段与当前时间匹配,并且两个日期字段(每月的某一天或每周的某一天)中至少有一个与当前时间匹配时,由 cron(8) 执行命令(请参阅下文“注意”)。 cron(8) 每分钟检查一次 cron 条目。时间和日期字段是:

field          allowed values
-----          --------------
minute         0-59
hour           0-23
day of month   1-31
month          1-12 (or names, see below)
day of week    0-7 (0 or 7 is Sun, or use names)

它还说:

字段可以是星号 (*),它始终代表“first-last”。

在示例中有:

 @weekly        Run once a week, "0 0 * * 0".

从星号描述来看,“0 0 * * 0”与“0 0 1-31 1-12 0”相同。我的问题是为什么不是每一天都符合这个表达?文件说

当分钟、小时和月份字段与当前时间匹配时,以及当至少有一个两天字段(一个月中的某一天或一周中的某一天)与当前时间匹配

那么为什么 2019.12.25 00:00 和 2019.12.26 00:00 不是这个表达式的有效时刻呢?

两者均满足“分钟、小时和月份字段与当前时间匹配",月份为 1-12,分钟和小时为 0。

而且他们俩都会满足“两个日期字段(一个月中的某一天或一周中的某一天)中至少有一个与当前时间匹配“ - 由于该月的日期是 1-31,一次满意就足够了。

我哪里错了?

答案1

正如德鲁本评论的那样,您错过了“请参阅下面的“注释””。

注意:命令执行的日期可以在以下两个字段中指定 - “月份中的日期”和“星期几”。如果两个字段都受到限制(即不包含该"*"字符),则当任一字段与当前时间匹配时将运行该命令。

0 0 * * 0具有*月份中的某一天,因此任一字段规则不适用。如果其中一个日期字段是 ,*而另一个不是*,则该命令仅在非*字段匹配时运行。这是*相当于数字范围的规则的一个例外。

手册中的错误是这句话

字段可以包含星号 ( *),它始终代表“first-last”。

没有提及这个例外。

答案2

最后一个字段指定仅有的周日跑步。日期和月份字段是开放的,以保证每个星期日都会被拾取。这正如广告中所宣传的那样工作。

相关内容