Кронд смещение пятиминутного графика


22

Можно ли компенсировать запуск сценария cron каждые 5 минут?

У меня есть два сценария, сценарий 1 собирает некоторые данные из одной базы данных и вставляет их в другую, сценарий 2 извлекает эти данные и множество других данных и создает из них несколько симпатичных отчетов. Оба сценария должны запускаться каждые 5 минут. Я хочу сместить сценарий 2 на одну минуту, чтобы он мог создать отчет из новых данных. Например, я хочу, чтобы выполнялся первый :00, :05, :10, :15 [...]сценарий, а второй - :01, :06, :11, :16 [...]каждый час. Сценарии не зависят друг от друга, и сценарий 2 должен выполняться независимо от того, был ли сценарий один успешным или нет. Но было бы полезно, если бы в отчетах были самые последние данные. Возможно ли это с помощью cron?

После;
Я думал об использовании обеих команд в сценарии оболочки, чтобы они запускались сразу после друг друга, но это не сработало, иногда сценарий 1 может зацикливаться на ожидании внешних API и т. Д., Поэтому запуск может занять до 15 минут, но сценарий 2 должен запускаться каждые 5 минут, поэтому выполнение этого способа остановит / задержит выполнение сценария 2. Если бы я мог установить это в Cron, это означало бы, что сценарий 2 будет выполняться независимо от того, что делает сценарий 1

Ответы:


14

Вы можете запускать скрипты, когда захотите cron. Если вы хотите запускать скрипт 1 каждые 5 минут, вы можете начать так:

*/5 * * * * /path/to/script1

Но это действительно просто сокращение для:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Если вы хотите запустить скрипт 2 через одну минуту после скрипта 1, вы можете сделать это:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Вы также можете сделать это:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

А затем в начале сценария 2, спать в течение одной минуты:

sleep 60

4
Помещение сна в сам сценарий - отвратительный хак, который делает запуск сценария вручную из-за быстрой подсказки болезненным. Есть менее уродливый способ взломать это , сделав сон частью записи crontab, но еще более элегантный способ - просто сместить задания, используя правильную запись crontab, к которой ваш ответ не касается.
Калеб

39

Минутное поле ввода для crontab принимает оператор «приращения», что несколько сбивает с толку, потому что похоже, что это должен быть математический оператор «деления на», но это не так. Вы чаще всего увидите, что он использует что-то вроде следующего. Обратите внимание, что это не находит числа, которые делятся на пять, а отбирает каждый пятый элемент из набора:

 */5 * * * * command

Это говорит cron о соответствии каждому пятому элементу ( /5) из набора минут 0-59 ( *), но вы можете изменить набор следующим образом:

 1-59/5 * * * * command

Для этого потребуется каждый пятый элемент из набора 1-59, выполнение команды в минуты 6, 11, 16 и т. Д.

Если вам нужно более детализированное смещение, чем одна минута, вы можете взломать его, используя команду sleep, как часть вашего crontab следующим образом:

 */5 * * * * sleep 15 && command

Это будет запускать вашу работу каждые пять минут, но на самом деле команда будет запускаться только через 15 секунд после минуты. Для кратковременных заданий, в которых разница между несколькими секундами и чем-то другим имеет значение, но вы не хотите опаздывать на целую минуту, это достаточно простой хак.


1
Это лучший ответ, чем принятый. Установка смещения через диапазон намного чище, чем сон.
ND Geek

11

Вы можете указать смещение времени с помощью символа +. Например, для запуска :01, :06, :11, :16 [...]создайте задачу, такую ​​как

*/5+1 * * * * command

7
Это не работает в некоторых версиях cron
jhoff

1
Какую версию cron вы используете, которая поддерживает этот синтаксис? Крони, кажется, не поддерживает это.
Мэтью Г

У меня Cronie на CentOS7, поэтому я не буду сначала пробовать это решение.
AnneTheAgile

1

Это сработало для меня:

1/5 * ? * * *

Где 1 - смещение минут. Так что если вы хотите сместить три минуты:

3/5 * ? * * *

У меня это работает в настройках расписания AWS

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.