cron 中的“每两分钟”是什么意思?

cron 中的“每两分钟”是什么意思?

我在 cron 中设置了两个脚本,每两分钟运行一次:*/2——问题是,它们不同步。一个在 1、3、5、7、9 分钟等运行,另一个在 0、2、4、6、8 分钟运行。这不是一个关键任务问题,但意味着我有两个状态报告,一个比另一个有点过时。

cron 到底是做什么的?按照 crontab 文档顺序运行第一个,等到它完成后再运行第二个?

有什么方法可以让我同时或尽可能接近地完成跑步?

答案1

该作业将尽可能接近给定时间运行,但可能会稍晚一些。正如 Chris 所建议的,最好的做法可能是创建一个小的 shell 脚本并安排它:

#!/bin/sh
/path/to/job/one &
/path/to/job/two &

在这种情况下,我在后台启动它们以确保它们同时或几乎同时运行,但根据您的系统、您的要求等,您必须对其进行调整以满足您的需要。

另请注意,在某些系统上 */2 不会实际上表示仅能被 2 整除的时间,但以等于 2 的步长重复发生。因此,如果作业最初启动时作业时间与 1 匹配,则它可能每隔奇数分钟运行一次,如您所见,而不是每隔偶数分钟运行一次。您可以尝试以下方法:

00-58/2

强制作业仅在偶数实例上启动,但这是否以及如何工作实际上取决于您的系统、您的 cron 守护程序的版本等。要获得更详细的帮助,您必须提供此信息 :)

答案2

在我看来,最好的选择是将两个脚本合并为一个,以确保它们在几乎相同的时间运行。

答案3

除了创建第三个(外部)脚本之外,另一个选择是将两个报告合并到单个命令行中并将其放入 cron:

*/2 * * * *  /path/to/job1 ; /path/to/job2

答案4

不,crontab 会由 cron 定期扫描以更新其计划。crontab 每一行上的计划交错组成一个全局计划。如果您有行 1、3、5、7、9 和行 2、4、6、8、10,您将在 1、2、3、4、5、6、7、8、9、10 处看到事情发生。

维基百科(经典) cron 使用的算法如下:

  1. 在启动时,在所有帐户持有者的主目录中查找名为 .crontab 的文件。
  2. 对于找到的每个 crontab 文件,确定将来下次运行每个命令的时间。
  3. 将这些命令放在 Franta-Maly 事件列表中(IIRC 这是一个高效的优先级队列结构),并附上它们相应的时间和“五字段”时间说明符。
  4. 进入主循环:

    1. 检查队列头部的任务条目,计算它将在多久后运行。
    2. 睡那段时间。
    3. 在唤醒时并验证正确的时间后,使用创建该任务的用户的权限执行队列头部的任务(在后台)。
    4. 确定将来下次运行此命令的时间,并将其放回该时间值的事件列表中。

如果您获得了 vixie cron 的副本(您可能正在使用它),那么您可能可以查看源代码。我猜您得到的报告偏移是由于计算中的舍入误差(休眠至少一分钟)。

相关内容