我在 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 使用的算法如下:
- 在启动时,在所有帐户持有者的主目录中查找名为 .crontab 的文件。
- 对于找到的每个 crontab 文件,确定将来下次运行每个命令的时间。
- 将这些命令放在 Franta-Maly 事件列表中(IIRC 这是一个高效的优先级队列结构),并附上它们相应的时间和“五字段”时间说明符。
进入主循环:
- 检查队列头部的任务条目,计算它将在多久后运行。
- 睡那段时间。
- 在唤醒时并验证正确的时间后,使用创建该任务的用户的权限执行队列头部的任务(在后台)。
- 确定将来下次运行此命令的时间,并将其放回该时间值的事件列表中。
如果您获得了 vixie cron 的副本(您可能正在使用它),那么您可能可以查看源代码。我猜您得到的报告偏移是由于计算中的舍入误差(休眠至少一分钟)。