CRON触发的速度有多快?

Mar*_*oma 7 cron timezone localtime

第一个例子

假设我有一个CRON工作

 30 2 * * * ....
Run Code Online (Sandbox Code Playgroud)

然后每当晚上2:30(当地时间)时这将运行.

现在假设我有时区Europe/Germany,它是2017-10-29(DST切换的那一天).然后这个CRON工作会运行两次,对吗?

第二个例子

假设我有时区Europe/Germany和CRON工作

 30 11 * * * ....
Run Code Online (Sandbox Code Playgroud)

由于德国从未在11:30进行过DST更改,因此不会产生干扰.但是用户可以改变当地时间.要非常明确:这个问题与DST无关.

对于以下测试用例,我想知道CRON作业是否/多久安排一次:

  1. 在11:29:58.0,用户将时间设置为11:31:00
  2. 在11:29:59.1,用户将时间设置为11:31:00
  3. 在11:29:59.6,用户将时间设置为11:31:00
  4. 在11:30:01.0,用户将时间设置为11:29:59.7 - 之后是否直接执行CRON?

他们归结为CRON触发的速度有多快?第四个也有问题,如果CRON存储它已经执行了那一分钟.

同一问题的另一个变体:

  1. 在11:29:59,NTP服务将时间更正为11:31:00 - 该作业将在那天执行吗?

df7*_*899 5

自信地回答这个问题的最简单方法是查看cron守护程序的源代码。有几个版本,网上像这样,也可以使用apt-get的源的cron

cron的滴答周期是重复睡眠一分钟,如果有工作要做,则该循环会更少。从睡眠中恢复后,立即检查时间并将结果视为以下wakeupKind值之一:

  • 预计时间-执行我们期望的所有工作
  • 小前跳(最多5分钟)-在中间的几分钟内运行作业
  • 中级跳转(最多3个小时,因此包括从春季开始的DST)-首先运行任何通配符作业(因为追赶可能要花一分钟以上的时间),然后才赶上介于中间的固定时间
  • 大跳动(两种方式都需要3小时或更长时间)-从当前时间开始
  • 向后跳(最多3个小时,因此包括DST的结束)-因为任何固定时间的作业都已经“可能”已经运行,所以只运行任何通配符作业,直到再次赶上时间为止

如有疑问,消息来源将清楚地注释这些wakeupKind值


编辑

为了跟踪是否sleep()可能受时钟变化的影响,似乎在几个Linux手册页中间接存在答案。

  • 首先,sleep()函数的注释确认已通过以下方式实现nanosleep()
  • nanosleep()的注释说,Linux使用CLOCK_MONOTONIC时钟来测量时间(即使POSIX.1认为不应该)
  • 在docs中对clock_settime()向下滚动以查看的说明CLOCK_MONOTONIC,该说明不受系统时间跳跃的影响,但会受到NTP样式的增量时钟同步调整的影响。

因此,总而言之,系统管理员样式的时钟更改不会对产生影响sleep()。但是例如,如果进行了NTP调整并说“稍微”提前了时钟,则cron会经历一系列稍微短的sleep()函数调用。