Все статьи
Руководства

Cron выражения: синтаксис и примеры

Структура cron: минуты, часы, дни, месяцы, дни недели. Примеры, генераторы, использование в Linux.

17 апреля 2025
8 мин чтения
ConvertHub
#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 поддерживают «читаемые» метки вместо пяти полей. Они удобны для типовых интервалов:

МеткаЭквивалентКогда запускается
@yearly0 0 1 1 *1 января в 00:00
@monthly0 0 1 * *1-го числа каждого месяца в 00:00
@weekly0 0 * * 0Каждое воскресенье в 00:00
@daily0 0 * * *Каждый день в 00:00
@hourly0 * * * *В начале каждого часа
@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 — он покажет следующие запуски и человекочитаемое описание.

Попробуйте эти инструменты

Похожие статьи