cron调度实际上是如何实现的,并确保脚本按时运行?


9

我想问一下cron的工作。好的,我们将脚本放在crontab中,然后cron守护程序执行它们。

现在,如果我理解这一点,则cron每分钟都会检查每个用户的crontab并执行配置的脚本。但是实际上是如何完成的呢?它会分叉子进程吗?

它不能按顺序执行任务,因为会浪费时间(例如,由于等待长时间运行的脚本完成)。那么这实际上是如何实现的。

只是为了提供帮助,我不是在寻找低级代码。对高级算法的描述(也许是对算法的描述?)或在大多数发行版中如何实现就足够了。

Answers:


9

我在StackOverflow的标题为“ cron如何在内部计划作业?

该帖子的摘录和有关cronWikipedia文章

The algorithm used by this cron is as follows:

1. On start-up, look for a file named .crontab in the home directories of 
   all account holders.

2. For each crontab file found, determine the next time in the future that
   each command is to be run.

3. Place those commands on the Franta-Maly event list with their corresponding
   time and their "five field" time specifier.

4. Enter main loop:

   1. Examine the task entry at the head of the queue, compute how far in 
      the future it is to be run.

   2. Sleep for that period of time.

   3. On awakening and after verifying the correct time, execute the task 
      at the head of the queue (in background) with the privileges of the 
      user who created it.

   4. Determine the next time in the future to run this command and place 
      it back on the event list at that time

标题为:cron如何工作的超级用户问答涵盖了您的一些其他问题。例如,关于cron如何处理在同一时间计划的作业的问题。该线程中的一个答案表明,当cron守护程序处理每个任务时,它会分叉每个计划的作业,这样就不会有单个作业充当时间重叠的作业的阻止者。


如果它是一个队列,那么任务将一个接一个地运行(那些任务在同一队列中)。因此,如果一个任务需要3分钟才能执行,并且队列中的下一个任务预计在下一分钟进行调度,这是怎么发生的?
2013年

@Jim-我认为您要进行的一种简化是,如果它根本不执行此操作,则它每分钟都会读取文件。当您保存文件时,crond守护程序将合并给定用户的crontab内容,然后根据其预期运行时间将其按排序顺序添加到队列中。
slm

好的,所以在这种情况下,队列中可能有应该同时运行的任务,那么子进程是派生的还是什么?
吉姆(Jim)

@吉姆-完全是。另请参阅答案中的其他评论。
slm

它如何检测我们为cron创建的新任务?它使用inotify之类的东西来监视文件系统还是其他东西?
CMCDragonkai
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.