tl;dr:cron 是否使用间隔的数值与当天的数值进行比较来确定其执行时间,还是在创建后的规定时间“每 3 天”一次?
题:
如果我添加以下作业,crontab -e
它会在明天午夜首次运行还是从明天开始运行三天?还是仅在每月的“第三”天?第 1、4、7、10 天……?
0 0 */3 * * /home/user/script.sh
我昨天把这个 cron 放进去,今天早上它运行了(这可能是我问题的答案),但我想验证这是否正确。今天是第 31 天,该间隔值似乎确实属于该序列。如果 cron 在本月 1 号开始执行一个间隔,它明天会为我再次运行吗?
补充说明:
有已经有一些关于cron的优秀文章和资源一般(这是一个共同的话题,我知道),但是,对于一个特定的时间间隔的出发点是不一样清楚给我。多个来源以多种方式表达它:
这个unixgeeks.org帖子指出:
Cron 还支持 'step' 值。dom 字段中的值 */2 表示命令每两天运行一次,同样,小时字段中的 */5 表示命令每 5 小时运行一次。
这个答案指出,cronjob of0 0 */2 * *
将在“每个奇数日的 00:00 执行(步骤 2 的默认范围,即 1,3,5,7,...,31)”
这篇博文中的另一个例子
0 1 1 */2 * command to be executed
应该在每月的第一天执行,每两个月的凌晨 1 点看来 cron 旨在*/3
根据与天(或秒、分、小时、月)的数值相比的间隔数值来执行间隔 cronjobs ( )。这是 100% 正确的吗?
PS这是关于 cron 的一个特定功能的一个非常具体的问题,(我相信)需要一些澄清。这应该让 Google 可以 100% 确定地告诉您,您的“每 3 个月”cron 将在添加到 crontab 后首次运行。
在crontab中(5)手册页使用的措辞,这是非常明确的:
步长值可以与范围结合使用。在带有“/number”的范围之后指定跳过该范围内的数字值。例如,可以在 hours 字段中使用“0-23/2”来指定每隔一小时执行一次命令(V7 标准中的替代方案是“0,2,4,6,8,10,12,14,16 ,18,20,22")。星号后也允许步进,因此如果您想说“每两个小时”,只需使用“*/2”。
确切的措辞(和示例)是“跳过该范围内的数字值”-暗示它从该范围中的第一个数字开始。
这意味着如果范围1-31
为天,值的情况下返回1-31/2
或者*/2
是1,3,5,7 ...等等。这也意味着,范围重置为初始值时,它已经运行通过。
因此,在这种情况下,cronjob 将在下个月的 31 日和 1 日运行,这也是正确的。
请注意,cron 有 2 个相互排斥的字段 - “月中的某天”和“周中的某天”。因此,当运行间隔几天的作业时,您必须选择其中之一。
如果你想定义一个每隔一天完美运行的 cronjob,你必须使用多行并根据当前日历自定义每个月。
今天(2020-07-31)是问这个问题的最佳日子,因为30有很多因素。
我的理解(根据记忆)是 (a) * 扩展到 1-31 的范围,然后 (b) /3 是该列表的跳过增量。因此,如果您编写 3-31/3,它将在 3 日、6 日、9 日、..、27 日(2 月)或 30 日(其他月份)运行。man -s 5 crontab 用范围暗示了这一点,但不包括除基值以外的示例。
我为每个跳过值设置了一个 crontab(Linux Mint 18.1):
30 13 */1 * * date > /home/paul/cron.1.log
30 13 */2 * * date > /home/paul/cron.2.log
30 13 */3 * * date > /home/paul/cron.3.log
...
30 13 */30 * * date > /home/paul/cron.30.log
30 13 */31 * * date > /home/paul/cron.31.log
Run Code Online (Sandbox Code Playgroud)
它只在跳跃为 1、2、3、5、6、10、15 和 30 的地方运行。这看起来像 (31 - 1) 的所有因子。
然后我将每个范围更改为 7-31/,并在跳跃为 1、2、3、4、6、8、12 和 24 时触发。这就是 (31 - 7) 的所有因数。
对于范围 8-31,只跳过 1 和 23 火,因为 (31 - 8) 是素数。
归档时间: |
|
查看次数: |
1722 次 |
最近记录: |