Cron-вирази без таємниць: плануйте що завгодно
Вам потрібно запускати резервне копіювання бази даних щоночі о 3 годині. Або надсилати звіт щопонеділка вранці. Або очищати кеш кожні 15 хвилин. На серверах Linux і Unix для цього є інструмент — cron, а спосіб вказати cron, коли що запускати, — cron-вираз.
Cron-вирази з першого погляду здаються лякаючими. 0 3 * * * або */15 9-17 * * 1-5 — це може виглядати як незрозумілий набір символів, якщо не знати шаблону. Але синтаксис напрочуд простий, щойно ви зрозумієте п'ять полів.
П'ять полів
Кожен стандартний cron-вираз має рівно п'ять полів, розділених пробілами. Кожне поле відповідає одиниці часу:
┌───────────── хвилина (0-59)
│ ┌───────────── година (0-23)
│ │ ┌───────────── день місяця (1-31)
│ │ │ ┌───────────── місяць (1-12)
│ │ │ │ ┌───────────── день тижня (0-7, де 0 і 7 — неділя)
│ │ │ │ │
* * * * *
Ось і все. П'ять полів зліва направо: хвилина, година, день місяця, місяць, день тижня.
Чи знали ви? Назва «cron» походить від грецького слова «chronos», що означає «час». Cron-демон (фоновий процес) є основною частиною Unix-подібних операційних систем з 1975 року.
Спеціальні символи
Зірочка (*) — кожне значення
Зірочка означає «кожне можливе значення» для цього поля.
* * * * * = кожну хвилину кожної години кожного дня.
Кома (,) — кілька значень
Кома розділяє окремі значення.
0 9,12,18 * * * = о хвилині 0 годин 9, 12 і 18 (9:00, 12:00, 18:00).
Дефіс (-) — діапазон значень
Дефіс визначає діапазон.
0 9-17 * * * = о хвилині 0 кожної години з 9 до 17 (щогодини від 9:00 до 17:00).
Слеш (/) — кроки
Слеш визначає інтервали.
*/15 * * * * = кожні 15 хвилин (хвилини 0, 15, 30, 45 кожної години).
0 */2 * * * = кожні 2 години о нульовій хвилині (опівночі, о 2, о 4...).
Читаємо cron-вирази: практика
Розберімо поширені приклади. Для кожного читаємо п'ять полів зліва направо.
0 3 * * * — щодня о 3:00
| Поле | Значення | Зміст |
|---|---|---|
| Хвилина | 0 | О хвилині 0 |
| Година | 3 | Годині 3 (3 ранку) |
| День місяця | * | Кожен день |
| Місяць | * | Кожен місяць |
| День тижня | * | Кожен день тижня |
Переклад: «О 3:00 щодня». Класичний вибір для нічного резервного копіювання.
*/15 * * * * — кожні 15 хвилин
| Поле | Значення | Зміст |
|---|---|---|
| Хвилина | */15 | Кожні 15 хвилин |
| Година | * | Кожна година |
| День місяця | * | Кожен день |
| Місяць | * | Кожен місяць |
| День тижня | * | Кожен день |
Переклад: «Кожні 15 хвилин, цілодобово». Часто використовується для перевірки стану та оновлення кешу.
0 9 * * 1-5 — по буднях о 9:00
| Поле | Значення | Зміст |
|---|---|---|
| Хвилина | 0 | О хвилині 0 |
| Година | 9 | Годині 9 |
| День місяця | * | Кожен день |
| Місяць | * | Кожен місяць |
| День тижня | 1-5 | Понеділок — п'ятниця |
Переклад: «О 9:00 з понеділка по п'ятницю». Ідеально для щоденних робочих звітів.
0 0 1 * * — перший день кожного місяця
| Поле | Значення | Зміст |
|---|---|---|
| Хвилина | 0 | О хвилині 0 |
| Година | 0 | Годині 0 (опівночі) |
| День місяця | 1 | 1-го числа |
| Місяць | * | Кожен місяць |
| День тижня | * | Будь-який день тижня |
Переклад: «Опівночі першого числа кожного місяця». Використовується для місячних звітів, виставлення рахунків або очищення.
30 8 * * 1 — щопонеділка о 8:30
| Поле | Значення | Зміст |
|---|---|---|
| Хвилина | 30 | О хвилині 30 |
| Година | 8 | Годині 8 |
| День місяця | * | Кожен день |
| Місяць | * | Кожен місяць |
| День тижня | 1 | Понеділок |
Переклад: «О 8:30 кожного понеділка». Чудово для щотижневих сповіщень команди.
Пишемо власні cron-вирази
Ось систематичний підхід:
- Починайте з «коли». «Щодня о 3 ранку» або «кожні 5 хвилин у робочий час».
- Заповнюйте поля зліва направо. Починайте з хвилини, потім — година, день місяця, місяць, день тижня.
- Використовуйте
*для «кожний». Якщо поле вас не цікавить, ставте*. - Перевіряйте перед розгортанням. Завжди переконуйтеся, що вираз дає очікуваний розклад.
Швидкий довідник поширених шаблонів
| Розклад | Вираз |
|---|---|
| Кожну хвилину | * * * * * |
| Кожні 5 хвилин | */5 * * * * |
| Кожну годину | 0 * * * * |
| Щодня опівночі | 0 0 * * * |
| Щодня о 3:00 | 0 3 * * * |
| Щопонеділка о 9:00 | 0 9 * * 1 |
| По буднях о 8:30 | 30 8 * * 1-5 |
| Перший день кожного місяця | 0 0 1 * * |
| Кожні 15 хв у робочий час | */15 9-17 * * 1-5 |
| Двічі на день (9 і 18 год) | 0 9,18 * * * |
| Щонеділі о 2:00 | 0 2 * * 0 |
Типові помилки
Забути, що години — 0-23
Година 13 — це 13:00, а не 1:00. Поширена помилка — написати 0 1 * * *, думаючи, що це 13:00, хоча насправді це 1:00 ночі.
Плутанина з днями тижня
Неділя може бути 0 або 7 (обидва варіанти валідні). Понеділок — 1, субота — 6. Дехто помилково думає, що понеділок — 0.
Взаємодія дня місяця і дня тижня
Якщо ви вказуєте і день місяця, і день тижня (жоден не є *), більшість реалізацій cron запускають завдання при виконанні будь-якої умови, а не обох одночасно. Це застає багатьох зненацька.
Увага Вираз 0 9 15 * 1 НЕ означає «о 9 год 15-го числа, але тільки якщо це понеділок». Це означає «о 9 год 15-го числа кожного місяця ТА о 9 год кожного понеділка». Це поширене джерело несподіваної поведінки.
Врахування часового поясу
Cron виконується в локальному часовому поясі сервера. Якщо ваш сервер у UTC, а ви в Києві (UTC+2 або UTC+3), завдання 0 9 * * * запуститься о 7:00 або о 6:00 за вашим часом. Завжди перевіряйте часовий пояс сервера.
Порада Тестуйте і візуалізуйте свої cron-вирази перед розгортанням: Як читати і тестувати cron-вирази. Перегляньте наступні часи запуску і переконайтеся, що розклад відповідає вашим очікуванням.
Створюйте і тестуйте свої cron-вирази:
Безкоштовно, миттєво, без реєстрації.