Cron-выражения: шпаргалка с примерами, которую не стыдно добавить в закладки
- Cron-выражение состоит из 5 полей: минута, час, день месяца, месяц, день недели.
- Каждое поле может содержать число, список (через запятую), диапазон (дефис), шаг (слеш) или звёздочку (любое значение).
- Специальные строки вроде @daily заменяют 5 полей, но не поддерживаются во всех системах.
- 90% ошибок — перепутанные поля дня месяца и дня недели, а также неверный часовой пояс.
- Тестировать cron можно с помощью онлайн-калькулятора, который покажет ближайшие срабатывания.
- Синтаксис cron-выражений: разбор полей и спецсимволы
- Специальные строки: @yearly, @daily, @reboot и другие
- Пошаговый разбор реального примера: бэкап базы данных
- Частные случаи: дни недели и месяца вместе, интервалы и списки
- Подводные камни и частые ошибки
- Как отлаживать cron: логи, тесты и онлайн-инструменты
- Сравнение cron с другими планировщиками (systemd, anacron, APScheduler)
- Продвинутые приёмы: переменные, перенаправления и flock
Синтаксис cron-выражений: разбор полей и спецсимволы
Cron-выражение — это строка из 5 полей, разделённых пробелами. Поля (по порядку):
- Минуты (0–59)
- Часы (0–23)
- День месяца (1–31)
- Месяц (1–12)
- День недели (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, но не во всех) доступны сокращения:
| Строка | Эквивалент | Описание |
|---|---|---|
| @yearly | 0 0 1 1 * | 1 января в полночь |
| @monthly | 0 0 1 * * | Первое число каждого месяца в полночь |
| @weekly | 0 0 * * 0 | Каждое воскресенье в полночь |
| @daily | 0 0 * * * | Каждый день в полночь |
| @hourly | 0 * * * * | Каждый час в 0 минут |
| @reboot | — | При запуске cron-демона (нестандарт) |
Важно: @reboot поддерживается не везде (например, в busybox cron его нет). Проверяйте документацию вашей системы.
Пример: @daily /usr/bin/backup.sh — то же, что 0 0 * * * /usr/bin/backup.sh.
Для расчёта времени выполнения удобен Калькулятор времени выполнения cron-задач.
Пошаговый разбор реального примера: бэкап базы данных
Задача: делать дамп PostgreSQL каждые 2 часа с 9:00 до 21:00 по будням, с очисткой старых бэкапов раз в месяц.
- Определяем частоту дампа: с 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— понедельник–пятница.
- Очистка старых бэкапов: 1-го числа каждого месяца в 3:00 ночи. Выражение:
0 3 1 * *. - Комбинируем в crontab:
Edge case: если бэкап может идти дольше 2 часов — накладывается следующий. Используйте flock или временные файлы.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
Частные случаи: дни недели и месяца вместе, интервалы и списки
Когда оба поля дней (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 генератор онлайн.
- 1Определите частоту
Уточните интервал: каждые 5 минут, раз в день и т.д.
- 2Запишите выражение
Используйте 5 полей или специальную строку.
- 3Проверьте онлайн-калькулятором
Вставьте выражение, убедитесь, что срабатывания верны.
- 4Добавьте в crontab
Запустите crontab -e и вставьте строку с командой.
- 5Перенаправьте вывод
Добавьте >> /var/log/mylog.log 2>&1 для логирования.
- 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: логи, тесты и онлайн-инструменты
- Проверьте, запущен ли cron-демон:
systemctl status cronилиservice cron status. - Просмотрите логи cron: обычно в
/var/log/syslogили/var/log/cron. Команда:grep CRON /var/log/syslog. - Используйте онлайн-калькулятор: Калькулятор времени выполнения cron-задач покажет ближайшие срабатывания.
- Протестируйте команду вручную: запустите команду из cron-задачи напрямую в терминале, чтобы убедиться, что она работает и вывод в нужное место.
- Используйте временную быструю задачу: поставьте
* * * * * /path/to/commandна минуту и проверьте логи — увидите, срабатывает ли вообще что-то. - Проверьте права на запускаемый файл:
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 или в файл.
Источники и нормативные документы
- Руководство по cron (man на русском)
- Crontab Guru — онлайн-редактор и проверка
- Документация OpenBSD: cron