cron 守护进程有多精确?

Seb*_*ian 25 linux cron

cron 作业调度器真的精确吗?

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

理想情况下,我会在 23.59(或晚上 11:59)运行 cron 作业,但系统真的会精确吗?既然一秒钟很重要,我应该将 cron 作业设置为 23:58 以让它离开一段时间吗?

kas*_*erd 24

cron 可以保证您的工作不会早于指定时间开始(取决于系统时钟的精度)。但是没有办法给你关于工作终止时间的任何保证。这将取决于很多因素:

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

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

  • @8bittree 如果你使用 `O_CREAT` 和 `O_EXCL` 标志,只要文件在本地文件系统上,它就会是原子的。 (4认同)

Fal*_*mot 14

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

看:

请注意,您的脚本将在时钟计时到正确时间时启动,但会在一段时间后完成。


Jos*_*ica 9

通常 cron 会在23:59:00开始,扫描你所有的 crontab 文件,过滤掉那些与23:59相关的文件,然后启动它们。扫描这些文件非常快,因为它们并不多,而且都只包含几行。所以通常,cronjobs 开始于23:59:0023:59:01 有一些方法可以故意放慢这个过程。(例如,向 crontab 添加数百万行)。如果系统完全过载,这也不会那么快地工作。

此外,这显然取决于实现。

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

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

  • 我相信 crontab 保存在内存中 - 如果您直接编辑 crontab 后面的文件(而不是 crontab -e,它在完成时通知 cron),更改将不会生效。cron 有大量的停机时间来计算即将出现的作业,它可以“休眠”直到作业运行的确切秒数。 (2认同)