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 часа в минуту 0 (полночь, 2:00, 4:00, ...).
Чтение cron-выражений: практика
Разберём типичные примеры. Для каждого читайте пять полей слева направо.
0 3 * * * — Ежедневно в 3:00
| Поле | Значение | Смысл |
|---|---|---|
| Минута | 0 | В минуту 0 |
| Час | 3 | Часа 3 (3:00) |
| День месяца | * | Каждый день |
| Месяц | * | Каждый месяц |
| День недели | * | Каждый день недели |
Перевод: «В 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:00 и 18:00) | 0 9,18 * * * |
| Каждое воскресенье в 2:00 | 0 2 * * 0 |
Типичные ошибки
Забывают, что часы считаются от 0 до 23
Час 13 — это 13:00 (1 PM), а не час 1. Распространённая ошибка — написать 0 1 * * *, думая, что задача выполнится в 13:00, тогда как на самом деле она выполнится в 1:00 ночи.
Путаница с днями недели
Воскресенье может быть 0 или 7 (оба варианта допустимы). Понедельник — 1, суббота — 6. Некоторые ожидают, что понедельник будет 0.
Взаимодействие дня месяца и дня недели
Если вы указываете и день месяца, и день недели (ни один не равен *), большинство реализаций cron выполняют задачу, когда выполнено любое из условий, а не когда выполнены оба. Это застаёт многих врасплох.
Предупреждение Выражение 0 9 15 * 1 НЕ означает «в 9:00 15-го числа, но только если это понедельник». Оно означает «в 9:00 15-го числа каждого месяца И в 9:00 каждый понедельник». Это частый источник неожиданного поведения.
Учёт часовых поясов
Cron работает в локальном часовом поясе сервера. Если ваш сервер в UTC, а вы в Москве (UTC+3), задача cron 0 9 * * * выполнится в 12:00 по вашему времени. Всегда проверяйте часовой пояс вашего сервера.
Совет Тестируйте и визуализируйте cron-выражения перед развёртыванием: Как читать и тестировать cron-выражения. Просматривайте время следующего запуска и проверяйте, что расписание соответствует вашим ожиданиям.
Создавайте и тестируйте cron-выражения:
Бесплатно, мгновенно, без регистрации.