Crond змістив п'ятихвилинний графік


22

Чи можна компенсувати набір сценарію cron, який запускається кожні 5 хвилин?

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

Повідомлення;
Я думав про використання обох команд у скрипті оболонки, щоб вони запускалися одразу один за одним, але це не спрацювало, іноді сценарій 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 тощо.

Якщо вам потрібно більше дрібнозернистих компенсацій, ніж за одну хвилину, ви можете зламати його, використовуючи команду сну як частину вашої кронтабули, наприклад:

 */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.