Cron выражения: синтаксис и примеры
Структура cron: минуты, часы, дни, месяцы, дни недели. Примеры, генераторы, использование в Linux.
Введение
Cron — это планировщик задач, который выполняет команды или скрипты по расписанию. Он появился в Unix в конце 1970-х и до сих пор остаётся стандартом автоматизации в Linux, macOS и большинстве серверных систем. Любой cron-план состоит из строк, каждая из которых описывает, когда запускать команду и что именно запускать. Само «когда» записывается компактной строкой из пяти полей — это и есть cron выражение. На первый взгляд строка вида0 3 * * 1-5 выглядит как бессмысленный набор символов, но за ней стоит простой и мощный синтаксис. В этой статье разберём структуру полей, специальные символы, типовые шаблоны и частые ошибки. Чтобы быстро проверить или разобрать существующее выражение, используйте наш разборщик cron.
Анатомия cron выражения
Стандартное cron выражение состоит из пяти полей, разделённых пробелами:
# ┌──────── минута (0–59)
# │ ┌────── час (0–23)
# │ │ ┌──── день месяца (1–31)
# │ │ │ ┌── месяц (1–12 или JAN–DEC)
# │ │ │ │ ┌ день недели (0–6 или SUN–SAT)
# │ │ │ │ │
# * * * * * командаСлева направо: минута, час, день месяца, месяц, день недели. После пятого поля через пробел указывается команда или путь к скрипту. Каждое поле принимает число в допустимом диапазоне, символ* (любое значение) или комбинацию с модификаторами.
Символ-звёздочка
Звёздочка означает «каждое значение поля». Например,* * * * * запускает команду каждую минуту, а0 * * * * — в нулевую минуту каждого часа, то есть ровно в 00:00, 01:00, 02:00 и так далее. Звёздочка — это всегда «каждый», а не «любой случайный»: в пределах поля интервал строго фиксирован.
Перечисление и диапазоны
Запятая задаёт список значений, дефис — диапазон. Строка0 9,12,18 * * * запустит команду в 09:00, 12:00 и 18:00, а 0 9-18 * * 1-5 — каждый рабочий день в 09:00, 10:00, 11:00 и так далее до 18:00. Эти два модификатора можно комбинировать: 0 9-12,17-19 * * * сработает в 09, 10, 11, 12, 17, 18 и 19 часов.
Шаг через слэш
Слэш / задаёт шаг внутри диапазона.*/15 * * * * — каждые 15 минут,0 */2 * * * — каждые два часа в нулевую минуту,0 0 */3 * * — каждые три дня в полночь. Шаг можно применять и к диапазону: 0 9-17/2 * * 1-5 запускается каждые два часа в рабочее время будних дней.
Типовые шаблоны и примеры
На практике 90% задач покрываются несколькими шаблонами. Ниже — коллекция самых распространённых cron выражений с пояснениями.
# Каждую минуту
* * * * * /usr/local/bin/check.sh
# Каждый день в 03:00 — ночной бэкап
0 3 * * * /opt/backup/nightly.sh
# Каждый понедельник в 06:00 — еженедельный отчёт
0 6 * * 1 /opt/reports/weekly.sh
# 1-го числа каждого месяца в 02:00
0 2 1 * * /opt/reports/monthly.sh
# Каждые 15 минут — мониторинг
*/15 * * * * /usr/local/bin/healthcheck.sh
# По будням в 09:00 и 18:00 — старт и стоп воркера
0 9,18 * * 1-5 /opt/worker/toggle.sh
# Каждую пятницу в 23:30
30 23 * * 5 /opt/cleanup/friday.sh
# 1 января в 00:00 — с Новым годом
0 0 1 1 * /opt/greetings/newyear.shКогда читать «день месяца» против «дня недели»
Если заполнены оба поля (не *), cron сработает при совпадении любого из них, а не обоих одновременно. Выражение 0 0 1 * 1 запустится и 1-го числа, и в каждый понедельник — это пересечение логическим ИЛИ. Чтобы получить «каждый первый понедельник месяца», придётся писать хитрее:0 0 1-7 * 1 не подойдёт, потому что сработает в любой понедельник первой недели. Проще проверить дату уже внутри скрипта.
Управление расписанием: crontab
Файл с cron-задачами пользователя называется crontab. Работать с ним принято не напрямую, а через утилиту crontab:
crontab -e— открыть в редакторе текущего пользователя;crontab -l— показать список задач;crontab -r— удалить все задачи;crontab -u alice -l— посмотреть задачи другого пользователя (нужны права root).
Системные задачи лежат отдельно — в каталогах/etc/cron.daily, /etc/cron.weekly,/etc/cron.monthly и в файле /etc/crontab. Формат последнего отличается шестым полем с именем пользователя:
# минута час день месяц день_недели ПОЛЬЗОВАТЕЛЬ команда
17 * * * * root cd / && run-parts --report /etc/cron.hourlyПеременные окружения
В cron доступен минимальный набор переменных: PATHчасто ограничен /usr/bin:/bin, а HOMEможет отличаться от домашнего каталога пользователя. Поэтому в начале crontab принято явно задавать параметры:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=ops@example.com
0 3 * * * /opt/backup/nightly.shВывод скрипта по умолчанию отправляется на email пользователя. Чтобы отключить рассылку, в конце команды добавляют перенаправление:/opt/script.sh >/dev/null 2>&1.
Расширения: @reboot, @daily и другие
Современные реализации cron поддерживают «читаемые» метки вместо пяти полей. Они удобны для типовых интервалов:
| Метка | Эквивалент | Когда запускается |
|---|---|---|
| @yearly | 0 0 1 1 * | 1 января в 00:00 |
| @monthly | 0 0 1 * * | 1-го числа каждого месяца в 00:00 |
| @weekly | 0 0 * * 0 | Каждое воскресенье в 00:00 |
| @daily | 0 0 * * * | Каждый день в 00:00 |
| @hourly | 0 * * * * | В начале каждого часа |
| @reboot | — | Один раз при старте демона cron |
Метка @reboot особенно полезна для запуска фоновых процессов, которые должны работать сразу после перезагрузки сервера, без systemd-юнитов: @reboot /opt/app/start.sh.
Частые ошибки и подводные камни
Слишком частый запуск
Строка * * * * * действительно означает «каждую минуту». Если предыдущий запуск скрипта занимает дольше минуты, cron всё равно запустит новый — процессы могут накапливаться и перегружать сервер. На помощь приходит блокировка черезflock:
* * * * * /usr/bin/flock -n /tmp/myscript.lock /opt/app/run.shФлаг -n говорит: если файл уже занят — немедленно выйти, не ждать освобождения.
Несовпадение часовых поясов
Демон cron работает в часовом поясе системы, а не пользователя. Если сервер настроен на UTC, а вы ожидаете запуск «в 9 утра по Москве», команда отработает в 12:00. Проверьте командойtimedatectl или date. В Docker-контейнерах часовой пояс часто приходится задавать явно через переменнуюTZ=Europe/Moscow.
Перенос строк и комментарии
Каждая cron-задача обязана помещаться в одну строку — продолжений через обратный слэш в стандарте нет. Комментарии начинаются с# и должны занимать отдельную строку. Команда# 0 0 * * * /opt/x.sh не закомментирует задачу, а создаст комментарий без действия — но визуально выглядит как отключённая строка. Чтобы временно выключить задачу, безопаснее поставить # именно перед всем полем.
Восклицательный знак в bash
Если в команде встречается ! (например, для отрицания в условии), некоторые оболочки пытаются интерпретировать его как историю команд. Чтобы избежать сюрпризов, в начале crontab полезно задать SHELL=/bin/bash и оборачивать команды в одинарные кавычки или скрипт-обёртку.
Альтернативы и смежные инструменты
Cron отлично подходит для повторяющихся задач на одном сервере, но в современных архитектурах у него есть конкуренты:
- systemd timers — более точные, с зависимостями и логированием в journalctl. Имеют секции
[Timer]с полямиOnCalendar, которое поддерживает свой синтаксис, похожий на cron. - Ansible / Chef / Puppet — декларативно описывают cron-задачи в коде инфраструктуры, что удобнее для команд.
- Cloud Scheduler / AWS EventBridge — для распределённых систем в облаке, где один планировщик запускает задачи на разных нодах.
Несмотря на альтернативы, cron остаётся базовым инструментом: он есть в каждом Linux-дистрибутиве, прост в понимании и не требует настройки инфраструктуры. Знать его синтаксис необходимо каждому разработчику и системному администратору.
Заключение
Cron выражение — это пять полей, которые описывают минуту, час, день месяца, месяц и день недели. Звёздочка означает «каждый», дефис — диапазон, запятая — список, слэш — шаг. В современных реализациях есть читаемые алиасы @daily,@weekly, @reboot. Главное при работе с cron — следить за часовым поясом, не забывать про переменные окружения и блокировать повторный запуск долгих задач черезflock. Помните про особенность с двойными полями «день месяца / день недели»: при заполнении обоих cron срабатывает по ИЛИ, а не по И. Чтобы разобрать незнакомое выражение или подобрать подходящее расписание, откройте нашпарсер cron — он покажет следующие запуски и человекочитаемое описание.
Попробуйте эти инструменты
Похожие статьи
Client-side vs Server-side: где обрабатывать файлы
Сравнение обработки файлов в браузере vs на сервере: приватность, скорость, ограничения, безопасность.
Почему браузерные инструменты лучше облачных
Преимущества client-side обработки: приватность, нет загрузки, нет регистрации, скорость, бесплатно.
Конвертация файлов: лучшие практики
Правила конвертации: сохранение качества, выбор формата, batch обработка, автоматизация.
Оптимизация веб-производительности: изображения
Lazy loading, responsive images, современные форматы (WebP, AVIF), CDN, сжатие, влияние на SEO.