Расписание cron: расшифровка и ближайшие запуски

Что такое cron

Cron — планировщик задач в Linux и других Unix-системах. Он работает в фоне и в нужное время запускает команды: резервное копирование по ночам, очистку временных файлов, отправку отчётов, обновление данных на сайте. Задачи записываются в файл crontab по одной на строку: сначала расписание из пяти полей, затем команда, которую нужно выполнить:

crontab
# каждый день в 03:30 сделать резервную копию
30 3 * * * /home/site/backup.sh

Ту же запись расписания используют не только серверы: задачи по времени в GitHub Actions (on: schedule), Kubernetes CronJob, облачные планировщики и библиотеки для Node.js и других языков. Поэтому выражение cron полезно уметь читать, даже если вы не администрируете сервер.

Как пользоваться

Введите выражение или выберите готовое расписание — описание и даты запусков обновятся сразу. Под полем подписано, какая часть выражения за что отвечает; при ошибке выделяется поле, в котором она найдена.

В списке «Часовой пояс расписания» выберите пояс, в котором работает планировщик: GitHub Actions по умолчанию считает расписание в UTC; Kubernetes CronJob — в поясе из поля .spec.timeZone, а если оно не задано, — в поясе kube-controller-manager; сервер с crontab — в своём поясе. Даты запусков всегда показываются по вашему времени, а время в поясе расписания — в скобках. Выбор запоминается в браузере.

Поле «Считать начиная с» показывает запуски от выбранной даты — например, перед Новым годом, 29 февраля или переводом часов. Раздел «Сработает ли в этот момент?» отвечает, подходит ли расписание под конкретные дату и время, и объясняет ответ по каждому полю. Кнопка со ссылкой копирует адрес, в котором сохранены выражение, часовой пояс и начальная дата, — его можно отправить коллеге.

Пять полей через пробел: минуты, часы, день месяца, месяц, день недели. Или макрос: @daily, @hourly…

Разбираем…

Пояс, в котором работает планировщик; смещение от UTC — на сегодня. Даты запусков ниже — всегда по вашему времени.
Пусто — от текущего момента. По вашему времени.

Ближайшие запуски

Ближайшие запуски

Поля выражения

Поля выражения
ПолеЗаписьЗначения

Сработает ли в этот момент?

Выберите дату и время — проверим каждое поле выражения.

    Для разбора включите JavaScript. Пример: 0 9 * * 1-5 — в 09:00 с понедельника по пятницу.

    Пять полей cron

    Код
    ┌───────── минуты (0–59)
    │ ┌─────── часы (0–23)
    │ │ ┌───── день месяца (1–31)
    │ │ │ ┌─── месяц (1–12 или jan–dec)
    │ │ │ │ ┌─ день недели (0–7 или sun–sat, 0 и 7 — воскресенье)
    │ │ │ │ │
    0 9 * * 1-5
    • * — любое значение: * * * * * запускает задачу каждую минуту.
    • , — список: 0 9,18 * * * — в 09:00 и 18:00.
    • - — диапазон: 1-5 в дне недели — с понедельника по пятницу.
    • / — шаг: */15 в минутах — каждые 15 минут, 9-18/3 в часах — в 9, 12, 15 и 18 часов.

    Вместо пяти полей можно написать макрос: @hourly, @daily (он же @midnight), @weekly, @monthly, @yearly. Макрос @reboot запускает задачу при старте системы и расписанием не является.

    День месяца или день недели

    Самая частая ловушка cron. Если ограничены оба поля, задача запускается, когда совпадает любое из них: 0 0 13 * 5 сработает и 13 числа, и в каждую пятницу, а не только в пятницу 13-го. Правило «и» действует, только когда одно из полей начинается со звёздочки, например */2. Инструмент учитывает это правило и в описании, и в датах запусков.

    Вопросы и ответы

    Почему в выражении шесть или семь полей?

    Это формат Quartz, Spring @Scheduled или node-cron: первым полем идут секунды, последним иногда год. В нём также есть символы ?, L, W и #. Обычный cron их не понимает; инструмент разбирает стандартный формат из пяти полей и объясняет такие ошибки.

    Можно ли запустить задачу раз в 90 минут?

    Одним выражением нет: шаг не переходит через границу часа или дня. Инструмент разбирает */90 в минутах как запуск в нулевую минуту каждого часа, а не раз в 90 минут. Понадобятся две строки — например, 0 0-21/3 * * * и 30 1-22/3 * * * — или проверка интервала внутри самой задачи.

    Что будет при переходе на летнее время?

    Зависит от планировщика. Время, которого в этот день нет, одни пропускают, другие переносят на ближайшее допустимое; повторяющийся час может сработать один или два раза. Предпросмотр здесь пропускает несуществующее время, а в повторяющемся часе показывает первый запуск — сверьтесь с документацией своего планировщика. В России часы не переводят, а расписания в UTC переход не затрагивает.

    Связанные инструменты

    Уникальные идентификаторы для задач и записей создаёт «Генератор UUID и ULID»; работа с датами в JavaScript описана в статье о методе Date.now().