Назад | Перейти на главную страницу

Crond смещает пятиминутный график

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

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

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

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

 */5 * * * * command

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

 1-59/5 * * * * command

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

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

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

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

Вы можете запускать скрипты, когда захотите, используя 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

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

*/5+1 * * * * command

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

1/5 * ? * * *

Где 1 - это смещение в минутах. Итак, если вы хотите компенсировать три минуты:

3/5 * ? * * *

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