Расписание cron: расшифровка и ближайшие запуски
Что такое cron
Cron — планировщик задач в Linux и других Unix-системах. Он работает в фоне и в нужное время запускает команды: резервное копирование по ночам, очистку временных файлов, отправку отчётов, обновление данных на сайте. Задачи записываются в файл 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 февраля или переводом часов. Раздел «Сработает ли в этот момент?» отвечает, подходит ли расписание под конкретные дату и время, и объясняет ответ по каждому полю. Кнопка со ссылкой копирует адрес, в котором сохранены выражение, часовой пояс и начальная дата, — его можно отправить коллеге.
Разбираем…
Ближайшие запуски
Поля выражения
| Поле | Запись | Значения |
|---|
Сработает ли в этот момент?
Выберите дату и время — проверим каждое поле выражения.
Для разбора включите 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().