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