Cron-выражения: шпаргалка с примерами, которую не стыдно добавить в закладки

💻 IT и кодОбновлено: 9 июля 2026 г.5 мин чтения
Каждый, кто настраивает бэкапы или мониторинг, сталкивался с cron. Но написать выражение с первого раза без ошибки — редкость. Пропущенный звёздочкой или неправильный интервал — и задача либо не выполняется, либо падает раз в час. Давайте раз и навсегда разберёмся с синтаксисом, отладкой и подводными камнями, чтобы ваши задачи работали как часы.
⚡ Коротко: главное
  • Cron-выражение состоит из 5 полей: минута, час, день месяца, месяц, день недели.
  • Каждое поле может содержать число, список (через запятую), диапазон (дефис), шаг (слеш) или звёздочку (любое значение).
  • Специальные строки вроде @daily заменяют 5 полей, но не поддерживаются во всех системах.
  • 90% ошибок — перепутанные поля дня месяца и дня недели, а также неверный часовой пояс.
  • Тестировать cron можно с помощью онлайн-калькулятора, который покажет ближайшие срабатывания.

Синтаксис cron-выражений: разбор полей и спецсимволы

Cron-выражение — это строка из 5 полей, разделённых пробелами. Поля (по порядку):

  1. Минуты (0–59)
  2. Часы (0–23)
  3. День месяца (1–31)
  4. Месяц (1–12)
  5. День недели (0–7, где 0 и 7 — воскресенье)

В каждом поле можно ставить:

  • Звёздочку * — любое значение (например, каждую минуту).
  • Число — конкретное значение.
  • Список через запятую — несколько значений (например, 1,15,30).
  • Диапазон через дефис — 9-17 (каждый час с 9 до 17).
  • Шаг через слеш — */10 (каждые 10 минут) или 0-30/5 (каждые 5 минут в первые 30 минут).

Пример: 30 8 * * 1-5 — в 08:30 по будням.

Не путайте: день месяца и день недели — разные поля. Если оба не *, то задача выполняется, когда совпадает хотя бы одно.

Для быстрой генерации используйте Cron генератор онлайн.

Специальные строки: @yearly, @daily, @reboot и другие

В некоторых реализациях (например, cron от GNU, Vixie cron, но не во всех) доступны сокращения:

СтрокаЭквивалентОписание
@yearly0 0 1 1 *1 января в полночь
@monthly0 0 1 * *Первое число каждого месяца в полночь
@weekly0 0 * * 0Каждое воскресенье в полночь
@daily0 0 * * *Каждый день в полночь
@hourly0 * * * *Каждый час в 0 минут
@rebootПри запуске cron-демона (нестандарт)

Важно: @reboot поддерживается не везде (например, в busybox cron его нет). Проверяйте документацию вашей системы.

Пример: @daily /usr/bin/backup.sh — то же, что 0 0 * * * /usr/bin/backup.sh.

Для расчёта времени выполнения удобен Калькулятор времени выполнения cron-задач.

Пошаговый разбор реального примера: бэкап базы данных

Задача: делать дамп PostgreSQL каждые 2 часа с 9:00 до 21:00 по будням, с очисткой старых бэкапов раз в месяц.

  1. Определяем частоту дампа: с 9 до 21 каждый будний день — каждые 2 часа. Выражение: 0 9-21/2 * * 1-5. Разберём:
    • Минуты: 0 — в начале часа.
    • Часы: 9-21/2 — каждый 2-й час в диапазоне 9–21 (9,11,13,15,17,19,21).
    • Дни месяца: * — любой.
    • Месяцы: * — любой.
    • Дни недели: 1-5 — понедельник–пятница.
  2. Очистка старых бэкапов: 1-го числа каждого месяца в 3:00 ночи. Выражение: 0 3 1 * *.
  3. Комбинируем в crontab:
    0 9-21/2 * * 1-5 pg_dump -U postgres mydb > /backup/db_$(date +\%Y\%m\%d_\%H\%M).sql
    0 3 1 * * find /backup -name '*.sql' -mtime +30 -delete
    Edge case: если бэкап может идти дольше 2 часов — накладывается следующий. Используйте flock или временные файлы.

Частные случаи: дни недели и месяца вместе, интервалы и списки

Когда оба поля дней (3-е поле и 5-е поле) заданы не звёздочкой, задача сработает при совпадении хотя бы одного из них.

Пример: 0 0 1,15 * 1,3 — задача выполнится 1-го и 15-го числа любого месяца, а также по понедельникам и средам (необязательно одновременно). Это не то же самое, что «1-го и 15-го, если они приходятся на понедельник или среду». Чтобы задать строгое совпадение, используют логические AND в скрипте.

Интервалы: 0 8-18 * * 1-5 — каждый час в будни с 8:00 до 18:00. Шаг: */15 — каждые 15 минут. Комбинированно: 0,30 9-17 * * * — в 0 и 30 минут каждого часа с 9 до 17.

Ошибка: 0 0 * * 0,6 — это не «выходные», а воскресенье и суббота (если 0=воскресенье, 6=суббота). В некоторых системах 7 тоже воскресенье.

Всегда проверяйте работу через Cron генератор онлайн.
Как написать и добавить cron-задачу
  1. 1
    Определите частоту

    Уточните интервал: каждые 5 минут, раз в день и т.д.

  2. 2
    Запишите выражение

    Используйте 5 полей или специальную строку.

  3. 3
    Проверьте онлайн-калькулятором

    Вставьте выражение, убедитесь, что срабатывания верны.

  4. 4
    Добавьте в crontab

    Запустите crontab -e и вставьте строку с командой.

  5. 5
    Перенаправьте вывод

    Добавьте >> /var/log/mylog.log 2>&1 для логирования.

  6. 6
    Проверьте логи

    Через минуту посмотрите syslog или файл лога.

Пошаговая инструкция от формулировки до проверки.

Подводные камни и частые ошибки

  • Часовой пояс: cron использует системный часовой пояс, обычно UTC. Если сервер в UTC, а вы в Москве (UTC+3), то @daily сработает в 3 часа ночи по местному времени.
  • Переход на летнее/зимнее время: задачи могут сработать дважды или не сработать вовсе (в час перевода). Рекомендуется использовать UTC.
  • Символ процента % в команде cron — специальный символ. Его нужно экранировать обратной косой чертой, иначе cron воспримет % как перевод строки. Пример: date +\%Y\%m\%d.
  • Среда выполнения: cron использует ограниченную среду (переменные PATH, HOME и т.д.). В командах лучше указывать полные пути к исполняемым файлам (например, /usr/bin/pg_dump).
  • Права доступа: cron-задачи выполняются от имени пользователя, который их добавил. Если команде нужны sudo-права — используйте visudo.
  • Логи: по умолчанию cron отправляет вывод на email владельца задачи. Если не перенаправить его в файл или /dev/null, можно забить почтовый ящик.

Пример перенаправления: 0 2 * * * /usr/bin/backup.sh >> /var/log/backup.log 2>&1.

Чек-лист: типичные ошибки при настройке cron

0 из 9

Как отлаживать cron: логи, тесты и онлайн-инструменты

  1. Проверьте, запущен ли cron-демон: systemctl status cron или service cron status.
  2. Просмотрите логи cron: обычно в /var/log/syslog или /var/log/cron. Команда: grep CRON /var/log/syslog.
  3. Используйте онлайн-калькулятор: Калькулятор времени выполнения cron-задач покажет ближайшие срабатывания.
  4. Протестируйте команду вручную: запустите команду из cron-задачи напрямую в терминале, чтобы убедиться, что она работает и вывод в нужное место.
  5. Используйте временную быструю задачу: поставьте * * * * * /path/to/command на минуту и проверьте логи — увидите, срабатывает ли вообще что-то.
  6. Проверьте права на запускаемый файл: chmod +x и владелец.
Никогда не полагайтесь на «глазами» — логи дадут точный ответ, выполнилась ли задача и с какой ошибкой.

Сравнение cron с другими планировщиками (systemd, anacron, APScheduler)

ИнструментОсобенностиКогда использовать
cron (Vixie)Точное время, короткие интервалыСтандарт в Linux, для задач с фиксированным временем
systemd timersГибкость, монотонные таймеры, зависимость от других unit-овСовременные системы с systemd, удобно для системных задач
anacronНе зависит от 24/7 работы (догонит пропущенные задачи)Ноутбуки, серверы с перезагрузками
APScheduler (Python)Из коробки cron-выражения, интеграция с кодомВеб-приложения на Python с плановыми задачами

Если ваша задача должна выполняться раз в день и неважно в какое время (например, обновление кэша), anacron удобнее. Для высокоточных задач (каждые 5 минут) — только cron.

Продвинутые приёмы: переменные, перенаправления и flock

Чтобы избежать наложения задач (если команда не успела завершиться), используйте flock:

*/5 * * * * /usr/bin/flock -n /tmp/my.lock /usr/bin/script.sh

Переменные внутри crontab: можно задать MAILTO="" для отключения отправки почты, или HOME=/path.

Использование rand: полезно для рандомизации времени старта

0 * * * * sleep $(( RANDOM % 3600 )) && /script.sh

Если нужно, чтобы задача выполнялась только в рабочие дни, используйте условный оператор в скрипте: проверка date +%u.

🧮 Посчитайте сами — инструменты по теме

🧭 Разделы по теме

Частые вопросы

Как написать cron-выражение для выполнения каждые 15 минут?

Используйте */15 в поле минут: */15 * * * * команда. Это сработает в 0,15,30,45 минут каждого часа.

Что такое cron и как он работает?

Cron — это демон-планировщик задач в Unix-подобных системах. Он читает файл crontab и выполняет команды в указанное время.

Как проверить, выполняется ли cron-задача?

Проверьте логи: sudo grep CRON /var/log/syslog или /var/log/cron. Также можно поставить временную задачу каждую минуту и проследить её запуск.

Какая разница между cron и crontab?

Cron — это демон (программа), которая выполняет задачи. Crontab — это файл (или команда для его редактирования), содержащий список задач для cron.

Почему моя cron-задача не выполняется?

Причин много: демон cron не запущен, неверное выражение, нет прав на файл, вывод перенаправлен в /dev/null, часовой пояс не совпадает, или команда требует интерактивный терминал.

Как в cron задать выполнение по будням с 9 до 18 каждый час?

Выражение: 0 9-18 * * 1-5 команда. В будни (1-5) с 9 до 18 каждый час в 0 минут.

Можно ли в cron использовать переменные?

Да, в crontab можно задавать переменные среды (MAILTO, PATH, HOME) и использовать их в командах. Но в самих выражениях переменные не поддерживаются.

Как отключить отправку почты от cron?

Добавьте в crontab строку MAILTO="" или перенаправьте вывод команды в /dev/null или в файл.

Источники и нормативные документы

  1. Руководство по cron (man на русском)
  2. Crontab Guru — онлайн-редактор и проверка
  3. Документация OpenBSD: cron

Ещё по теме «IT и код»