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

Можно ли компенсировать запуск сценария 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
Другие вопросы по тегам