Перейти до вмісту

Синтаксис виразів cron

Вираз cron — це п'ять полів, які описують, коли щось має запуститися. Кожне поле говорить, які значення його одиниці допустимі, і завдання запускається в кожну хвилину, де всі п'ять узгоджуються. Це весь модель: немає тривалості, немає «кожні 90 хвилин» і ніде не зберігається стан наступного запуску.

Поля читаються зліва направо як хвилина, година, день місяця, місяць, день тижня. Приклади внизу — це ті, за якими люди насправді сягають, і кожен з них аналізується власним cron парсером цього сайту перед тим, як будується ця сторінка.

Останній розділ список синтаксис, який виглядає як cron, але тут не приймається: розширення Quartz та Jenkins та шістьпольова форма з секундами. Варто їх знати, тому що скопійований вираз, який використовує один з них, просто не спрацює.

П'ять полів

7

Рядок cron складається з п'яти полів, розділених пробілами, потім команди. Кожне поле має бути присутнім; немає способу пропустити будь-яке.

ВиразДіапазонЗначення
* * * * *min hod dom mes dowП'ять полів у порядку: хвилина, година, день місяця, місяць, день тижняП'ять зірочок означає кожну хвилину кожного дня — найслабший можливий вираз.
minute0-59Перше поле
hour0-23Друге поле, у 24-годинному форматі
day of month1-31Третє полеДень, який не існує в даному місяці, просто пропускається — 31-е запускається сім разів на рік, а не дванадцять.
month1-12Четверте поле
day of week0-7П'яте поле, неділя першоюНеділю означають 0 і 7 — тому діапазон йде до семи, а не до шести.
0 5 13 * 5Коли обидва поля дні обмежені, cron запускається на будь-якому з них — не на обохЦе запускається 13-го та на кожну п'ятницю, тому це не «п'ятниця, 13». Це єдине правило cron, яке вражає всіх.

Оператори

10

Одні й ті ж чотири оператори працюють у кожному полі; змінюються лише числа, які вони приймають.

ВиразДіапазонЗначення
*Кожне значення, яке дозволяє поле
1,15,30Список окремих значень
9-17Включний діапазон
*/15Кожне n-е значення по всьому полю*/15 у полі хвилин означає :00, :15, :30 та :45 — це рахує від дна діапазону, а не від тепер.
9-17/2Кожне n-е значення всередині діапазону
5/10Кожне n-е значення від стартової точки до кінця поля
0,30 9-17 * * 1-5Оператори вільно комбінуються у будь-якому поліНа половину години, між дев'ятою та п'ятою, з понеділка по п'ятницю.
JAN-DEC1-12Назви місяців, три букви, без урахування регістру
SUN-SAT0-6Назви днів, три букви, без урахування регістру
70Неділя, написана іншим способом

Скорочені макроси

7

Сім назв, які означають цілий вираз. Вони зручність формату crontab, а не граматика полів, тому планувальник, який читає рядки cron, не обов'язково їх приймає.

ВиразДіапазонЗначення
@hourly0 * * * *На вершині кожної години
@daily0 0 * * *Один раз на день опівночі
@midnight0 0 * * *Те саме, що @daily
@weekly0 0 * * 0Один раз на тиждень, неділя опівночі
@monthly0 0 1 * *Першого числа місяця опівночі
@yearly0 0 1 1 *Першого січня опівночі
@annually0 0 1 1 *Те саме, що @yearly

Готові приклади

14

Коли вираз перестає мати сенс, читайте його справа наліво: найбільш загальне поле справа, і воно вирішує, на які дні навіть закріплюються дрібніші.

ВиразДіапазонЗначення
* * * * *Кожну хвилину
*/5 * * * *Кожні п'ять хвилин
0 * * * *Кожну годину, на її вершину
0,30 * * * *Кожні півгодини
0 3 * * *Кожен день о 03:00
0 9,17 * * *Двічі на день, о 09:00 та 17:00
*/15 9-17 * * 1-5Кожні п'ятнадцять хвилин під час робочих годин у робочі дні
0 8 * * 1-5У робочі дні о 08:00
0 10 * * 6,0У суботу та неділю о 10:00
30 7 * * MONУ понеділок о 07:30
0 0 1 * *Опівночі першого дня кожного місяця
0 0 28-31 * *Кожний день в останній частині місяцяСтандартний cron не має поняття «останній день місяця». Це запускається до чотирьох разів; звичайна виправка — це скрипт, який перевіряє дату та рано виходить.
0 0 1 1,4,7,10 *Опівночі першого дня кожного кварталу
0 0 1 1 *Один раз на рік, на початку 1 січня

Розширення, які цей сайт не приймає

6

Quartz, Jenkins та деякі хмарні планувальники додають їх. Вони перелічені, щоб ви їх впізнали в чужому crontab — парсер на цьому сайті відхиляє кожний з них, як і cron, що поставляється з Linux.

ВиразДіапазонЗначення
?«Немає конкретного значення» у полі дня, що вже обмежує іншу
LОстанній день місяця або останній заданий день тижня
15WРобочий день, найближчий до 15-го
FRI#3Третя п'ятниця місяця
*/30 * * * * *Шосте поле для секунд, спередуШість полів, а не п'ять. Цю форму використовують Quartz та декілька бібліотек; файл crontab — ні.
@rebootЗапуститися один раз при запуску машиниРеальний у crontab, але це не розклад — немає наступного запуску для обчислення, тому парсер тут його відхиляє.

FAQ

Чому мою роботу на «п'ятниці, 13» запускали кожну п'ятницю?
Тому що коли обидва поля — день місяця та день тижня — обмежені, cron розглядає їх як або-або, а не як і. 0 5 13 * 5 запускається 13-го числа та на кожну п'ятницю. Справжня п'ятниця, 13 потребує перевірки дати всередину самого скрипту.
Означає */5 «п'ять хвилин від тепер»?
Ні. Кроки рахуються від дна діапазону поля, а не від часу встановлення завдання, тому */5 у полі хвилин означає :00, :05, :10 тощо незалежно від того, коли був написаний вираз.
Яку часову зону використовує cron?
Системну, якщо crontab не встановить CRON_TZ або TZ у верхній частині. Це має наслідки двічі на рік: завдання, заплановане в годину, яку перехід на літній час пропускає, не запускається, а те, що в повторювальній годині, може запуститися двічі.
Чи 0 те саме, що й 7 у полі дня тижня?
Так, обидва — це неділя. Дублікат існує, тому що діапазон 1-7, що охоплює понеділок-неділю, може бути записаний природним чином, що поле 0-6 не може виразити в одному діапазоні.
Де я можу перевірити вираз?
Cron парсер на цьому сайті приймає вираз і показує наступні запуски звичайною мовою, локально у вашому браузері. Конструктор поруч з ним іде інший напрямок: виберіть розклад і він напише вираз.