Как на самом деле реализовано планирование cron и обеспечивает ли он выполнение скриптов вовремя?

9

Я хочу спросить о работе cron. Хорошо, мы помещаем скрипты в crontab, и демон cron выполняет их.

Теперь, если я это понимаю, cron проверяет crontab каждого пользователя каждую минуту и ​​выполняет настроенные сценарии. Но как это на самом деле сделано? Разветвляет ли он дочерние процессы и т.д.?

Он не может выполнять задачи последовательно, поскольку время может быть потеряно (например, из-за ожидания завершения длинного сценария). Так как это на самом деле реализовано.

Просто, чтобы выручить, я не ищу код низкого уровня. Мне достаточно описания высокого уровня (возможно, алгоритма?) Или как это реализовано в большинстве дистрибутивов.

Джим
источник

Ответы:

9

Я нашел этот вопрос и ответы в StackOverflow под названием: Как cron внутренне планирует задания? ,

выдержка из этого поста и статья в википедии о cron

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

Это SuperUser Q & A под названием: Как работает cron? охватывает некоторые из ваших дополнительных вопросов. Например, ваш вопрос о том, как cron работает с заданиями, запланированными на одно и то же время. Один из ответов в этом потоке гласит, что, когда демон cron обрабатывает каждую задачу, он разветвляет каждое запланированное задание, поэтому ни одно задание не будет блокировать выполнение заданий с перекрывающимся временем.

SLM
источник
Если это очередь, то задачи запускаются одна за другой (те, что в одной очереди). Итак, если для выполнения задачи требуется 3 минуты, а следующая задача в очереди должна быть запланирована на следующую минуту, как это происходит?
Джим
@ Джим - я думаю, что одно из упрощений, которое вы предполагаете, заключается в том, что он читает файлы каждую минуту, когда вообще не делает этого. Когда вы сохраняете файл, демон crond включает в себя содержимое crontab для данного пользователя и добавляет его в очередь в отсортированном порядке в зависимости от времени в будущем, которое предполагается запустить.
SLM
Итак, в этом случае в очереди могут быть задачи, которые должны выполняться одновременно. Так что дочерние процессы разветвляются или что-то?
Джим
@ Джим - точно. Также смотрите мои дополнительные комментарии в ответе.
SLM
Как он обнаруживает новые задачи, которые мы создаем для cron? Использует ли он что-то вроде inotify для просмотра файловой системы или что-то еще?
CMCDragonkai