Насколько точен демон cron?

22

Планировщик заданий cron действительно точен?

Я имею в виду, что мне нужен сценарий для запуска каждую ночь как можно раньше, НО до 00:00 следующего дня.

В идеале я бы запустил работу cron в 23.59 (или в 23:59), но будет ли система действительно точной? Поскольку секунда имеет значение, я должен установить работу cron на 23:58, чтобы оставить ее на некоторое время?

Себастьян
источник
13
Почему у вас есть эти требования? У меня есть ощущение, что будет лучший способ сделать то, что вы действительно пытаетесь сделать, и вы можете также спросить об этом. (Это займет немного больше усилий, чем просто планирование работы cron, но, возможно, не намного больше.)
David Z
Раньше я использовал старый тупой крон с точностью до 10 минут.
Джошудсон
7
Ваше требование выглядит не очень надежным для меня. Что вы делаете, если ваша система имеет высокую нагрузку около полуночи. Если у вас нет системы RT, вы не можете ничего гарантировать.
Томас Эркер
Учтите, что даже если вам удастся приобрести сервер, который всегда доступен и всегда может выполнить свою работу менее чем за секунду, все же есть вещи, которые могут пойти не так. Например, ваши часы могут начать дрейфовать без вашего осознания. Это действительно очень хрупко, и я согласен с приведенными выше комментариями о том, что система должна измениться.
Крис Хейс

Ответы:

24

Cron может гарантировать, что ваша работа начнется не раньше указанного времени (в зависимости от точности системных часов). Но нет никакой возможности дать вам какую-либо гарантию о времени прекращения работы. Это будет зависеть от множества факторов:

  • Насколько загружена система
  • Что делает работа
  • Замедление из-за проблем с оборудованием
  • Замедление из-за проблем с сетью (при условии, что работа зависит от сети)

Я рекомендую изменить ваш дизайн так, чтобы конкретное время выполнения не было обязательным.

kasperd
источник
1
Самый простой способ сделать это, вероятно, состоит в том, чтобы задание, запущенное с помощью cron, создало файл, указывающий, что оно выполняется, и которое удаляется при выходе из задания (успешно или безуспешно), а затем следующее задание (при условии, что это цель) подождите, пока файл не исчезнет, ​​прежде чем он что-то сделает.
CVn
@ MichaelKjörling Вы должны использовать каталог, а не файл, поскольку проверка файла и последующее его создание не являются атомарными .
8bittree
1
@ 8bittree вы также можете использовать flock, если он доступен.
user9517 поддерживает GoFundMonica 9.09.15
1
@ MichaelKjörling Но зачем беспокоиться о том, что, возможно, все в порядке, а правильный случай также проще?
8bittree
4
@ 8bittree Если вы используете O_CREATи отметите, O_EXCLон будет атомарным, пока файл находится в локальной файловой системе.
Касперд
14

Я полагаю, это зависит от вашего демона cron, но документация и стандарт указывают, что если вы укажете минуты, задание будет выполнено в указанную минуту.

Видеть:

Имейте в виду, что ваш сценарий будет запущен, когда часы перейдут на правильное время, но завершится через некоторое время.

Сокол Момот
источник
У меня есть виртуальный сервер с очень низкой нагрузкой, и, тем не менее, cron, который запускается каждую минуту, будет иногда начинаться с 0, 1, 2, иногда до 17. Я предполагаю, что cron может быть менее точным на виртуальном сервере, так как другие процессы вне этого сервера могут влиять на доступность ресурсов, таких как процессор.
Лиам
8

Обычно cron запускается в 23:59:00 , сканирует все файлы crontab, отфильтровывает тех, кто имеет отношение к 23:59, а затем запускает их. Сканирование этих файлов выполняется очень быстро, потому что их не так много, и все они содержат только несколько строк. Поэтому обычно cronjobs начинаются в 23:59:00 или 23:59:01. Есть определенные способы намеренно замедлить этот процесс. (добавить миллионы строк в crontab, например). Если система полностью перегружена, это тоже не будет работать так быстро.

Кроме того, это, очевидно, зависит от реализации.

Если вам нужно очень точное время запуска, вам лучше создать программу, которая спит до нужного времени, а затем запускается (например, с помощью c ++ 11 ). Но на ОС не реального времени это также не будет точным! Также часы ПК не знают точное время!

Во всех случаях это только гарантирует, что программа запускается в (более или менее) нужное время. Не может быть никакой гарантии, что программа завершится успешно до определенного времени, поэтому я твердо верю, что вы должны что-то изменить по этому требованию.

Josef
источник
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, но в сильно загруженной системе нет и не может быть никаких обещаний.
Хоббс