Як прочитати cron-вираз поле за полем
Cron-вираз — це короткий рядок тексту, який повідомляє планувальнику, коли запускати завдання. Звична форма має п'ять полів, розділених пробілами: хвилина, година, день місяця, місяць і день тижня. Рядок 0 9 * * 1-5 означає 09:00 з понеділка по п'ятницю. Кожне поле — це число, назва, список, діапазон або крок, а * означає кожне значення. Завдання запускається в ті моменти, коли збігаються всі поля.
П'ять полів
| Поле | Допустимі значення | Приклад |
|---|---|---|
| Хвилина | від 0 до 59 | 30 — це 30-та хвилина години |
| Година | від 0 до 23 | 9 — це 09:00 у 24-годинному форматі |
| День місяця | від 1 до 31 | 15 — 15-те число |
| Місяць | від 1 до 12, або від JAN до DEC | 3 або MAR — березень |
| День тижня | від 0 до 6, або від SUN до SAT | 0 або SUN — неділя, 1 — понеділок |
Деякі системи також приймають 7 як неділю, але не всі, тож користуйтеся 0 або SUN. У цій формі в cron немає поля секунд, тож найменший крок — одна хвилина.
Списки, діапазони, кроки й назви
означає кожне значення в полі.* * * *запускається щохвилини.- Список використовує коми.
0 9,17 * * *запускається о 09:00 і о 17:00 щодня. - Діапазон використовує дефіс.
1-5у полі дня тижня означає з понеділка по п'ятницю. - Крок використовує косу риску.
*/15у полі хвилин означає 0, 15, 30 і 45.10-30/5означає 10, 15, 20, 25 і 30. - Назви, як-от
MON-FRI, можуть замінювати числа. Вони легші для читання, якщо ваш планувальник їх приймає.
Ці частини можна комбінувати. 0 8-18/2 * * * запускається на 0-й хвилині кожної другої години від 08:00 до 18:00.
Типові розклади
| Вираз | Значення |
|---|---|
* * * * * | Щохвилини |
/15 * * * | Кожні 15 хвилин |
0 * * * * | На 0-й хвилині кожної години |
0 2 * * * | Щодня о 02:00 |
0 9 * * 1-5 | 09:00, з понеділка по п'ятницю |
0 9,17 * * * | 09:00 і 17:00 щодня |
30 6 1 * * | 06:30 першого числа кожного місяця |
0 0 * * 0 | Північ щонеділі |
0 0 1 1 * | Північ 1 січня |
/5 9-17 * 1-5 | Кожні 5 хвилин з 09:00 до 17:55, з понеділка по п'ятницю |
Зверніть увагу: 0 0 * * — це північ, а 0 12 * * — полудень. Помилка з годиною — одна з найпоширеніших.
День місяця і день тижня
Коли обидва поля — день місяця і день тижня — обмежені, завдання запускається, коли збігається будь-яке з них. Це класичне правило у Vixie cron і багатьох системах, що від нього походять. Тож 0 0 13 * 5 запускається о півночі 13-го числа кожного місяця, а також щопʼятниці. Часто очікують лише п'ятницю 13-го, а запусків виходить більше, ніж планувалося.
Якщо одне з цих двох полів — *, враховується лише інше. Щоб запускати завдання лише в п'ятницю 13-го, плануйте його на кожну п'ятницю і перевіряйте дату всередині скрипта. Інші планувальники, зокрема деякі хмарні сервіси, можуть використовувати інші правила, тож читайте їхню документацію.
Часові пояси та літній час
Cron працює за годинником машини або сервісу, на якому запущений, зазвичай це місцевий часовий пояс цієї машини. Завдання, налаштоване на 02:30, запускається о 02:30 за цим годинником. Спершу перевірте пояс (у Linux його показує date). Якщо ви хочете, щоб завдання всюди йшли за одним годинником, багато команд запускають сервери в UTC, а деякі планувальники дозволяють задавати часовий пояс для кожного завдання.
Літній час переводить годинник двічі на рік. Навесні багато місць переходять від 02:00 одразу на 03:00, тож завдання о 02:30 не має коли запуститися. Восени година з 01:00 до 01:59 трапляється двічі. Планувальники обробляють ці випадки по-різному: одні пропускають завдання, інші запускають його один раз, а треті — двічі. Тримайте завдання поза раннім ранковим вікном переходу або використовуйте UTC, якщо різниця для вас важлива.
Шість полів і Quartz
Деякі планувальники додають поле секунд на початку, тож /10 * * * * запускається кожні 10 секунд. Планувальник Quartz для Java використовує секунди, хвилини, години, день місяця, місяць, день тижня і необов'язковий рік, а також додає чотири спеціальні символи:
?означає «конкретного значення немає». Quartz вимагає його в полі дня місяця або дня тижня — в тому, яке ви не задаєте.Lозначає останній.Lу полі дня місяця — це останній день місяця, а6Lу полі дня тижня — остання п'ятниця.Wозначає найближчий будній день.15W— це будній день, найближчий до 15-го, і він не переходить в інший місяць.#означає n-й день тижня.6#3— це третя п'ятниця.
Quartz нумерує дні інакше, ніж у п'ятипольовій формі. Його 1 — неділя, а 7 — субота, тож понеділок–п'ятниця — це 2-6, а не 1-5. Завжди перевіряйте, який формат використовує ваш планувальник, перш ніж копіювати рядок.
Типові помилки
*/7у полі хвилин. Значення будуть 0, 7, 14 і так далі до 56. Наступним було б 63, але такого значення не існує, тож після 56 запуск відбувається на 0-й хвилині наступної години. Проміжок — лише чотири хвилини, а інтервали нерівномірні. Використовуйте крок, що ділить 60 без остачі, наприклад 5, 10, 15 або 30.- 30 лютого. Такої дати не існує, тож
0 0 30 2 *ніколи не запускається. Так само і з 31-м числом у місяці з 30 днями. За правилом «будь-яке з двох» обмеження дня тижня все ще може викликати запуск в інші дні, тож перевіряйте результат. - Година 24 або хвилина 60. Це поза допустимим діапазоном. Більшість планувальників відхиляють такі значення під час збереження, але не всі.
- Очікування секунд. П'ятипольовий рядок запускається лише у цілі хвилини.
- Плутанина cron із регулярними виразами. У cron
означає кожне значення. У регулярному виразіозначає повторити попередній елемент. Для шаблонів скористайтеся тестером регулярних виразів, а рядки cron тримайте окремо.
Перевірте наступні запуски
Перш ніж покладатися на розклад, прочитайте рядок простими словами і випишіть кілька найближчих часів запуску. Пояснювач cron-виразів робить обидві речі, і це найшвидший спосіб помітити правило «будь-яке з двох» або дивний крок.
Короткі відповіді
Перше поле — хвилини чи секунди?
Хвилини, у стандартній п'ятипольовій формі. Лише деякі шестипольові планувальники додають секунди, і ставлять їх першими.
Чому моє завдання запускається по п'ятницях і ще 13-го?
Поля дня місяця і дня тижня обидва задані, тож завдання запускається, коли збігається будь-яке з них. Задайте одному полю *, якщо хочете лише інший варіант.
Чи використовує cron UTC?
Лише якщо машину або сервіс налаштовано на UTC. Інакше використовується місцевий часовий пояс цієї системи.
Переклад з Англійський оригінал за допомогою ШІ.
Коментарі
Коментарів поки немає. Будьте першим.


