Как составить cron-выражение для crontab
Генератор помогает собрать расписание для cron без ошибок: выберите готовый шаблон или заполните пять полей, и инструмент объяснит выражение по-русски и покажет пять ближайших запусков. Вставьте существующую строку из crontab — и проверите, когда она на самом деле сработает.
Поддерживается классический формат Vixie cron и cronie, который используется в Linux: пять полей, списки, диапазоны, шаги, названия месяцев и дней недели, макросы @daily и @hourly. Всё считается в браузере, выражения никуда не отправляются.
Как пользоваться генератором cron
- 1Нажмите на подходящий шаблон — например, «Каждые 5 минут» или «По будням в 09:00» — или введите своё выражение в верхнее поле.
- 2Уточните расписание в полях «Минуты», «Часы», «День месяца», «Месяц» и «День недели»: выражение обновится автоматически.
- 3Прочитайте расшифровку и таблицу полей: в ней видно, на какие значения раскрывается каждое поле.
- 4Сверьте ближайшие 5 запусков. Переключатель «UTC» покажет расписание так, как его увидит сервер с часовым поясом UTC.
- 5Скопируйте готовую строку, откройте crontab -e на сервере и добавьте её вместе со своей командой.
Формат cron-выражения: пять полей
Строка crontab состоит из пяти полей расписания, разделённых пробелами, и команды. Поля читаются слева направо: минута, час, день месяца, месяц, день недели. Задача запускается в каждую минуту, которая подходит под все условия.
| Поле | Допустимые значения | Пример |
|---|---|---|
| Минута | 0–59 | 30 — в 30 минут |
| Час | 0–23 | 3 — в 3 часа ночи |
| День месяца | 1–31 | 1 — первого числа |
| Месяц | 1–12 или JAN–DEC | 1-6 — с января по июнь |
| День недели | 0–7 или SUN–SAT (0 и 7 — воскресенье) | 1-5 — с понедельника по пятницу |
Специальные символы: звёздочка, список, диапазон и шаг
Четыре символа покрывают почти любое расписание. Их можно комбинировать: например, 0-30/10,45 в поле минут означает 0, 10, 20, 30 и 45.
| Символ | Значение | Пример | Результат |
|---|---|---|---|
| * | Любое значение поля | * в поле часов | Каждый час |
| , | Список значений | 0,30 в поле минут | В 0 и 30 минут |
| - | Диапазон включительно | 1-5 в дне недели | С понедельника по пятницу |
| / | Шаг | */15 в поле минут | 0, 15, 30 и 45 минут |
| / | Шаг внутри диапазона | 9-17/2 в поле часов | 9, 11, 13, 15 и 17 часов |
Шаг не всегда даёт ровный интервал
Шаг отсчитывается от начала диапазона и обрывается на его конце. Выражение */7 в поле минут даёт 0, 7, 14 … 56, а затем снова 0 — между 56-й минутой и началом следующего часа пройдёт только 4 минуты. Для ровных интервалов выбирайте делители 60: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30.
Примеры cron-выражений
Самые частые расписания, которые можно сразу скопировать в crontab:
| Выражение | Когда запускается |
|---|---|
| * * * * * | Каждую минуту |
| */5 * * * * | Каждые 5 минут |
| 0 * * * * | В начале каждого часа |
| 0 */6 * * * | В 00:00, 06:00, 12:00 и 18:00 |
| 0 3 * * * | Каждый день в 03:00 |
| 30 9 * * 1-5 | По будням в 09:30 |
| */10 9-18 * * 1-5 | Каждые 10 минут с 09:00 до 18:59 по будням |
| 0 0 * * 0 | Каждое воскресенье в полночь |
| 0 0 1 * * | Первого числа каждого месяца в 00:00 |
| 0 4 1 1,4,7,10 * | Раз в квартал: 1 января, апреля, июля и октября в 04:00 |
Макросы @daily, @hourly и @reboot
Вместо пяти полей можно написать короткий макрос. Генератор раскрывает его в обычное выражение и показывает ближайшие запуски.
| Макрос | Эквивалент | Когда запускается |
|---|---|---|
| @hourly | 0 * * * * | В начале каждого часа |
| @daily, @midnight | 0 0 * * * | Каждый день в 00:00 |
| @weekly | 0 0 * * 0 | Каждое воскресенье в 00:00 |
| @monthly | 0 0 1 * * | Первого числа месяца в 00:00 |
| @yearly, @annually | 0 0 1 1 * | 1 января в 00:00 |
| @reboot | — | Один раз при запуске демона cron |
День месяца и день недели: ловушка с «или»
Если заданы оба поля — и день месяца, и день недели, — cron запускает задачу, когда совпадает любое из них, а не оба сразу. Выражение 0 0 13 * 5 сработает 13-го числа каждого месяца и в каждую пятницу, а не только в пятницу 13-го.
Правило «или» действует, только когда ни одно из двух полей не начинается со звёздочки. Если одно из них — * или шаг вида */2, условия объединяются через «и». Генератор учитывает обе ситуации и предупреждает, когда включается логика «или».
Чтобы запустить задачу только в пятницу 13-го, оставьте в cron одно условие, а второе проверьте в самой команде: 0 0 13 * * [ "$(date +\%u)" -eq 5 ] && /path/script.sh. Знак процента в crontab нужно экранировать обратным слешем, иначе cron воспримет его как перевод строки.
Почему cron-задача не запускается
Cron не сообщает о проблемах: если задача не стартовала или упала, вы узнаете об этом только по последствиям — пропавшему бэкапу или устаревшей выгрузке. Чаще всего причина в одном из пунктов:
- Часовой пояс сервера отличается от вашего: проверьте его командой timedatectl и сверяйте расписание в режиме UTC.
- У cron минимальное окружение: PATH короче, чем в терминале, переменные из .bashrc не подгружаются. Указывайте полные пути к программам и файлам.
- Неэкранированный символ % обрезает команду: всё после него cron передаёт на стандартный ввод.
- Скрипт не исполняемый или запускается не от того пользователя: проверьте права и владельца файла.
- Вывод отправлен в /dev/null, поэтому ошибок не видно. Пишите stdout и stderr в лог-файл.
- В конце файла crontab нет перевода строки: многие реализации cron в таком случае пропускают последнюю строку.
Частые вопросы
Как запускать задачу каждые 5 минут?
+
Используйте выражение */5 * * * *. Задача будет запускаться в 0, 5, 10 и так далее до 55 минут каждого часа.
Можно ли запускать cron каждые 30 секунд?
+
Нет, минимальный шаг классического cron — одна минута. Обходной путь — две строки: одна с командой, вторая с sleep 30 перед командой. Для точных интервалов удобнее systemd-таймеры или планировщик внутри приложения.
В каком часовом поясе работает cron?
+
В системном часовом поясе сервера. На облачных серверах это часто UTC. Cronie поддерживает переменную CRON_TZ, которая задаёт пояс для строк ниже неё.
Воскресенье — это 0 или 7?
+
Оба значения означают воскресенье. Понедельник — 1, суббота — 6. Можно писать и названия: SUN, MON, TUE, WED, THU, FRI, SAT.
Поддерживаются ли секунды, год и символы L, W, #?
+
Нет. Это расширения Quartz и некоторых других планировщиков с 6–7 полями. Классический crontab понимает только пять полей и символы *, запятую, дефис и косую черту.
Как посмотреть и отредактировать задачи cron?
+
Команда crontab -l показывает задачи текущего пользователя, crontab -e открывает их в редакторе. Системные задачи лежат в /etc/crontab и в каталоге /etc/cron.d.
Как узнать, что cron-задача выполнилась?
+
Запись о запуске появляется в системном журнале, но об ошибке внутри скрипта cron не сообщит. Надёжнее heartbeat-мониторинг: в конце успешного выполнения задача отправляет запрос на специальный URL, а если сигнала нет вовремя, приходит уведомление.