Генератор cron-выражений

Соберите расписание для crontab из готовых шаблонов или по полям, проверьте выражение и посмотрите ближайшие запуски в вашем часовом поясе.

* — любое значение, — список: 1,15- — диапазон: 1-5/ — шаг: */10, 0-30/5

Что означает выражение

Каждые 5 минут

ПолеЗначениеСрабатывает на
Минуты*/50, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55
Часы*все значения
День месяца*все значения
Месяц*все значения
День недели*все значения

Ближайшие 5 запусков

Считаем…

Cron на сервере работает в часовом поясе сервера (часто это UTC). Если он отличается от вашего, сверяйте расписание в режиме UTC или с переменной CRON_TZ.

Строка для crontab

*/5 * * * */usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Замените путь на свою команду. Откройте редактор командой crontab -e и добавьте строку в конец файла.

Cron молчит, когда задача не запустилась. Heartbeat-мониторинг PingDesk ждёт сигнал от задачи по расписанию и присылает уведомление, если бэкап или выгрузка не отработали вовремя.

Мониторинг cron-задач

Как составить cron-выражение для crontab

Генератор помогает собрать расписание для cron без ошибок: выберите готовый шаблон или заполните пять полей, и инструмент объяснит выражение по-русски и покажет пять ближайших запусков. Вставьте существующую строку из crontab — и проверите, когда она на самом деле сработает.

Поддерживается классический формат Vixie cron и cronie, который используется в Linux: пять полей, списки, диапазоны, шаги, названия месяцев и дней недели, макросы @daily и @hourly. Всё считается в браузере, выражения никуда не отправляются.

Как пользоваться генератором cron

  1. 1Нажмите на подходящий шаблон — например, «Каждые 5 минут» или «По будням в 09:00» — или введите своё выражение в верхнее поле.
  2. 2Уточните расписание в полях «Минуты», «Часы», «День месяца», «Месяц» и «День недели»: выражение обновится автоматически.
  3. 3Прочитайте расшифровку и таблицу полей: в ней видно, на какие значения раскрывается каждое поле.
  4. 4Сверьте ближайшие 5 запусков. Переключатель «UTC» покажет расписание так, как его увидит сервер с часовым поясом UTC.
  5. 5Скопируйте готовую строку, откройте crontab -e на сервере и добавьте её вместе со своей командой.

Формат cron-выражения: пять полей

Строка crontab состоит из пяти полей расписания, разделённых пробелами, и команды. Поля читаются слева направо: минута, час, день месяца, месяц, день недели. Задача запускается в каждую минуту, которая подходит под все условия.

Поля cron-выражения
ПолеДопустимые значенияПример
Минута0–5930 — в 30 минут
Час0–233 — в 3 часа ночи
День месяца1–311 — первого числа
Месяц1–12 или JAN–DEC1-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

Вместо пяти полей можно написать короткий макрос. Генератор раскрывает его в обычное выражение и показывает ближайшие запуски.

МакросЭквивалентКогда запускается
@hourly0 * * * *В начале каждого часа
@daily, @midnight0 0 * * *Каждый день в 00:00
@weekly0 0 * * 0Каждое воскресенье в 00:00
@monthly0 0 1 * *Первого числа месяца в 00:00
@yearly, @annually0 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, а если сигнала нет вовремя, приходит уведомление.

Связанные инструменты