是 cron 作业调度程序真的精确的?
我的意思是,我需要一个脚本尽可能每晚运行一次,但必须在第二天 00:00 之前运行。
我理想情况下会在 23:59(或晚上 11:59)运行 cron 作业,但系统真的会精确吗?既然一秒都很重要,我是否应该将 cron 作业设置为 23:58 以留出一些时间?
答案1
cron 可以保证您的作业不会早于指定时间开始(取决于系统时钟的精度)。但是没有办法保证作业的终止时间。这将取决于很多因素:
- 系统负载如何
- 这项工作是做什么的
- 由于硬件问题导致速度缓慢
- 由于网络问题导致速度缓慢(假设工作依赖于网络)
我的建议是改变您的设计,这样就不需要特定的完成时间了。
答案2
我想这取决于你的 cron 守护程序,但文档和标准表明,如果你指定分钟数,作业将在指定的分钟执行。
看:
请注意,您的脚本将在时钟转到正确时间时启动,但会在那之后的某个时间完成。
答案3
通常 cron 会于23:59:00,扫描所有 crontab 文件,过滤掉与23:59然后启动它们。扫描这些文件非常快,因为它们不多,而且都只有几行。所以通常,cronjobs 启动于23:59:00或者23:59:01 确实有一些方法可以故意减慢此过程。(例如,向 crontab 添加数百万行)。如果系统完全超载,这也不会那么快起作用。
而且,这显然依赖于实施。
如果你需要非常精确的开始时间,你最好创建一个程序,让它休眠到你想要的时间然后运行(例如使用c++11)。但在非实时操作系统上,这也不会准确!而且 PC 的时钟也不知道准确的时间!
在所有情况下,这仅确保程序开始在您想要的时间(或多或少)。不能保证程序结束直到给定的时间才成功,所以我坚信你应该对该要求进行一些改变。
答案4
这取决于您的整体脚本执行时间和服务器时间的精度。
59 23 * * * /some/script/file.sh
将启动你的脚本确切地在 23:59,但是,如果您有一些运行时间较长的命令,部分脚本可能会在午夜后执行。