cron守护程序有多精确?


22

Cron Job Scheduler 真的很精确吗?

我的意思是,我需要一个脚本来尽可能晚地运行,但要在第二天的00:00之前运行。

理想情况下,我会在23.59(或晚上11:59)运行cron作业,但是系统真的很精确吗?因为一秒钟很重要,所以我应该将cron作业设置为23:58以便保留一些时间吗?


13
为什么会有这些要求?我觉得会有一种更好的方法来做您真正想做的事情,您最好也问一下。(这不仅比安排cron工作要花更多的精力,而且也许不多。)
David Z

我以前使用过的老哑表,精度为10分钟。
joshudson

7
您的要求对我来说似乎不太可靠。如果系统在午夜左右有高负载,该怎么办。除非您有RT系统,否则您将无法保证任何事情。
Thomas Erker

考虑一下,即使您设法购买一台始终可用的服务器,并且始终可以在一秒钟之内完成您的工作,但仍有可能出错。例如,您的时钟可能开始漂移而没有意识到。这确实非常脆弱,我同意上述需要更改系统的评论。
克里斯·海斯

Answers:


24

cron可以保证的是,您的工作将不早于指定的时间开始(取决于系统时钟的精度)。但是无法为您提供有关工作终止时间的任何保证。这将取决于许多因素:

  • 系统如何加载
  • 工作是做什么的
  • 由于硬件问题导致速度慢
  • 由于网络问题而速度慢(假设工作取决于网络)

我的建议是更改您的设计,以使不需要特定的完成时间。


1
最简单的方法可能是让通过cron启动的作业创建一个文件,以指示该文件正在运行,每当该作业退出(成功或失败)时都将其删除,然后再删除下一个作业(假设这是目的)等待文件消失,然后再执行任何操作。
CVn 2015年

@MichaelKjörling您应该使用目录而不是文件来检查文件,然后创建它不是atomic
8bittree

1
@ 8bittree您也可以使用flock(如果有)。
user9517支持GoFundMonica

1
@MichaelKjörling但是,当正确的案例也更简单时,为什么还要打扰也许还可以的案例呢?
8bittree

4
@ 8bittree如果使用O_CREATO_EXCL标志,则只要文件位于本地文件系统上,它将是原子的。
kasperd

14

我想这取决于您的cron守护程序,但是文档和标准指出,如果您指定分钟,则作业将在指定的分钟执行。

看到:

请注意,您的脚本将在时钟滴答到正确的时间时启动,但会在此后的某个时间结束。


我有一台虚拟服务器,负载很低,但是设置为每分钟运行的cron有时会从0s,1s,2s(有时甚至是17s)开始。我的猜测是,cron在虚拟服务器上的准确性可能较低,因为该服务器之外的其他进程可能会影响CPU等资源的可用性。
利亚姆

8

通常,cron将在23:59:00开始,扫描所有crontab文件,过滤出与23:59相关的文件,然后启动它们。扫描此文件的速度非常快,因为它们不多,而且都只包含几行。所以通常情况下,cronjobs开始在23:59:0023时59分01秒 有一定的方法来此过程中故意放慢。(例如,向crontab添加数百万行)。如果系统完全过载,那么它也不会那么快地工作。

同样,这显然取决于实现。

如果需要非常精确的开始时间,最好创建一个程序,该程序一直休眠直到所需时间,然后再运行(例如,使用c ++ 11)。但是在非实时操作系统上,这也不是很准确!PC的时钟也不知道确切的时间!

在所有情况下,这仅可确保程序在(或多或少)您希望的时间启动。在给定的时间之前无法保证程序成功结束,因此我坚信您应该对此要求进行一些更改。


2
我相信crontabs会保存在内存中-如果您直接编辑crontab后面的文件(而不是crontab -e,它会在完成时通知cron),那么更改将不会生效。cron有大量的停机时间来解决即将出现的工作,它可以“休眠”,直到要运行该工作的确切时间为止。
AMADANON Inc.

0

这取决于您的总体脚本执行时间和服务器时间的精度。

59 23 * * * /some/script/file.sh

会在23:59 完全启动您的脚本,但是,如果您有一些可以长时间使用的命令,则脚本的一部分可能会在午夜之后执行。


正好在23:59,那么它可以是23:59:00到23:59:59?
AL

2
您的常规Cron时间没有几秒钟。要获得额外的59秒,您必须在代码顶部添加“ wait(59)”。
亨利的猫

4
@AL在实践中,我一直看到它在xx:xx:00或xx:xx:01上运行,但是在负载很重的系统上没有任何承诺。
hobbs 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.