Кронд смещение пятиминутного графика
Можно ли компенсировать запуск сценария 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
5 ответов
Вы можете запускать сценарии в любое время, используя 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
Минутное поле ввода для crontab принимает оператор "приращения", что несколько сбивает с толку, потому что похоже, что это должен быть математический оператор "деления на", но это не так. Вы чаще всего увидите, что он использует что-то вроде следующего. Обратите внимание, что это не находит числа, которые делятся на пять, а отбирает каждый пятый элемент из набора:
*/5 * * * * command
Это говорит cron, чтобы соответствовать каждому пятому элементу (/5
) из набора минут 0-59 (*
) но вы можете изменить набор следующим образом:
1-59/5 * * * * command
Для этого потребуется каждый пятый элемент из набора 1-59, выполнение команды в минуты 6, 11, 16 и т. Д.
Если вам нужно более детализированное смещение, чем одна минута, вы можете взломать его, используя команду sleep, как часть вашего crontab следующим образом:
*/5 * * * * sleep 15 && command
Это будет запускать вашу работу каждые пять минут, но на самом деле команда будет запускаться только через 15 секунд после минуты. Для кратковременных заданий, в которых разница между несколькими секундами и чем-то другим имеет значение, но вы не хотите опаздывать на целую минуту, это достаточно простой хак.
Вы можете указать смещение времени с помощью символа +. Например, бегать в :01, :06, :11, :16 [...]
создать задачу, такую как
*/5+1 * * * * command
Это сработало для меня:
1/5 * ? * * *
Где 1 - смещение минут. Так что если вы хотите сместить три минуты:
3/5 * ? * * *
У меня это работает в настройках расписания AWS
Это проблема XY. Смещение cron от целых часовых интервалов или их общих долей, как правило, может быть полезным для уменьшения количества совпадающих процессов, но в этом вопросе явно указано, что смещение предназначено для разрешения зависимости. Сценарий 2 опирается на сценарий 1, поэтому использование только времени для обеспечения выполнения последовательности приводит в лучшем случае к задержке, а в худшем — к состоянию гонки.
Лучше поместить их в одну строку заданий cron. Если вторая команда должна выполняться независимо от результата первого сценария (или первая не использует правильные, ненулевые коды выхода в случае сбоя), замените&&
с;
*/5 * * * * /path/to/script1 && /path/to/script2