Технологии #Linux #Ubuntu #Сервер #Терминал #Домашний сервер #Инструменты

Генератор cron: расписание для crontab с проверкой

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

8 минут 3

Cron — встроенный в Linux планировщик: он сам запускает скрипты по расписанию. Резервная копия каждую ночь, очистка логов по воскресеньям, обновление сертификата раз в месяц — всё это одна строка в crontab. Сложность только в самой строке: */15 9-18 * * 1-5 с первого взгляда не прочитать.

Генератор ниже переводит расписание на русский язык и показывает даты ближайших запусков — так сразу видно, сработает ли задача тогда, когда нужно. Можно писать выражение целиком, править отдельные поля или начать с готового варианта. Внизу — готовая строка для crontab, команда, которая добавит её без редактора, и то же расписание в виде таймера systemd.

Ближайшие запуски по времени вашего устройства

    Что можно писать в поле

    *
    любое значение
    5
    ровно 5
    1,15
    список: 1 и 15
    1-5
    диапазон: с 1 по 5
    */10
    шаг: каждые 10
    9-18/2
    шаг внутри диапазона
    mon, jan
    названия дней и месяцев

    Как устроено выражение cron

    Строка в crontab — это пять полей расписания и команда:

    Текст
    ┌───────── минута (0–59)
    │ ┌─────── час (0–23)
    │ │ ┌───── день месяца (1–31)
    │ │ │ ┌─── месяц (1–12 или jan–dec)
    │ │ │ │ ┌─ день недели (0–6 или sun–sat, 0 и 7 — воскресенье)
    │ │ │ │ │
    0 3 * * * /home/nixlife/backup.sh

    Задача срабатывает, когда текущее время совпадает со всеми полями. Звёздочка значит «любое значение». 0 3 * * * читается так: минута 0, час 3, любой день, любой месяц, любой день недели — то есть каждый день в 03:00.

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

    ЗаписьЗначениеПримерЧто получится
    *любое* * * * *каждую минуту
    Nровно N30 8 * * *в 08:30
    a,b,cсписок0 9,13,18 * * *в 09:00, 13:00 и 18:00
    a-bдиапазон0 9 * * 1-5в 09:00 по будням
    */Nшаг*/10 * * * *каждые 10 минут
    a-b/Nшаг в диапазоне0 8-20/4 * * *в 08, 12, 16 и 20 часов

    Готовые примеры расписаний

    ВыражениеКогда срабатывает
    */5 * * * *каждые 5 минут
    0 * * * *каждый час, в начале часа
    0 */6 * * *каждые 6 часов: 00:00, 06:00, 12:00, 18:00
    0 3 * * *каждый день в 03:00
    30 8 * * 1-5по будням в 08:30
    0 10 * * 6,0по выходным в 10:00
    */15 9-18 * * 1-5каждые 15 минут в рабочее время по будням
    0 4 * * 0раз в неделю, в воскресенье в 04:00
    0 2 1 * *первого числа каждого месяца в 02:00
    0 0 1 */3 *раз в квартал: 1 января, апреля, июля, октября
    0 0 1 1 *раз в год, 1 января

    Любое выражение можно открыть в генераторе по ссылке — пробелы заменяются подчёркиванием: /generator-cron/#*/15_9-18_*_*_1-5.

    Вместо пяти полей cron понимает короткие слова: @hourly (каждый час), @daily (каждый день в полночь), @weekly (по воскресеньям в полночь), @monthly (первого числа), @yearly (1 января) и @reboot — один раз при загрузке системы.

    Как добавить задачу в crontab

    У каждого пользователя свой список заданий. Открыть его на редактирование:

    Терминал
    crontab -e

    При первом запуске система спросит, в каком редакторе открывать, — проще всего выбрать nano. Вставьте строку в конец файла, сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X). Cron подхватит изменения сам, перезапускать ничего не нужно.

    Остальные команды:

    Терминал
    crontab -l          # показать свои задания
    sudo crontab -e     # задания от имени root
    sudo crontab -l -u nixlife  # задания другого пользователя

    Добавить строку без редактора — удобно в скриптах установки — можно так (генератор соберёт команду сам):

    Терминал
    (crontab -l 2>/dev/null; echo '0 3 * * * /home/nixlife/backup.sh') | crontab -

    Пять причин, почему задача в cron не срабатывает

    Скрипт из терминала работает, а по расписанию — нет. Почти всегда дело в одном из пунктов:

    1. Другое окружение. Cron запускает команды с минимальным PATH (/usr/bin:/bin) и без ваших настроек из .bashrc. Пишите полные пути: /usr/bin/python3, /usr/local/bin/rclone. Узнать путь к программе — which rclone. Либо задайте PATH= первой строкой crontab.
    2. Знак %. В crontab он означает перевод строки. Команда date +%Y-%m-%d оборвётся на первом проценте — экранируйте его: date +\%Y-\%m-\%d. Генератор делает это автоматически.
    3. Нет прав на запуск. Скрипт должен быть исполняемым (chmod +x backup.sh, подробнее — в калькуляторе chmod) и начинаться со строки #!/bin/bash.
    4. Ошибки никто не видит. Вывод задачи по умолчанию уходит на локальную почту, которой обычно нет. Добавьте в конец строки >> $HOME/cron.log 2>&1 — генератор делает это, если стоит галочка «записывать вывод в лог».
    5. Часовой пояс. Cron работает по времени системы. Если на сервере UTC, задача «в 03:00» выполнится в 06:00 по Москве. Проверить — timedatectl, поменять — sudo timedatectl set-timezone Europe/Moscow.

    Проверить, запускал ли cron задачу вообще, можно по системному журналу:

    Терминал
    grep CRON /var/log/syslog | tail -20
    # или в системах без syslog
    journalctl -u cron --since today

    Ловушка: день месяца и день недели одновременно

    Если указать и число, и день недели, cron сработает, когда совпадёт любое из них. 0 9 13 * 5 — это не «в пятницу 13-го», а «каждое 13-е число и каждую пятницу». Генератор предупреждает об этом.

    Чтобы получить «только пятницу 13-го», оставьте в расписании один день недели, а число проверьте внутри команды:

    Терминал
    0 9 * * 5 [ "$(date +\%d)" = "13" ] && /home/nixlife/friday13.sh

    Тот же приём для «последнего дня месяца», которого в обычном cron нет:

    Терминал
    55 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /home/nixlife/month-end.sh

    Cron или таймер systemd

    В современных дистрибутивах есть второй планировщик — таймеры systemd. Генератор переводит расписание и в их формат (OnCalendar=). Чем они отличаются:

    cronтаймер systemd
    Настройкаодна строкадва файла: сервис и таймер
    Логинужно перенаправлять вручнуюсами попадают в journalctl
    Если компьютер был выключензапуск пропадётPersistent=true выполнит пропущенный
    Случайная задержка, зависимостинетRandomizedDelaySec=, After=network-online.target
    Проверка расписаниявнешними средствамиsystemd-analyze calendar

    Для простых задач на своём сервере cron удобнее — строка и готово. Для важных и долгих задач, особенно на компьютере, который иногда выключается, лучше таймер. На домашнем сервере хорошо работают оба.

    Если компьютер выключается на ночь, а задача должна выполняться раз в сутки, есть ещё anacron: скрипты из /etc/cron.daily, /etc/cron.weekly и /etc/cron.monthly он запустит при следующем включении.

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

    Как запускать задачу каждые 30 секунд?

    Минимальный шаг cron — одна минута. Обходной путь — две строки: * * * * * команда и * * * * * sleep 30; команда. Если нужна точность до секунд, используйте таймер systemd: OnCalendar=*:*:0/30.

    Как сделать «каждые 2 часа начиная с 1:00»?

    Через шаг в диапазоне: 0 1-23/2 * * * — сработает в 01:00, 03:00, 05:00 и так далее. Запись */2 всегда начинается с нуля.

    Где хранится crontab?

    Личные задания — в /var/spool/cron/crontabs/имя_пользователя, но править этот файл напрямую не нужно, только через crontab -e. Системные задания лежат в /etc/crontab и /etc/cron.d/ — там перед командой есть шестое поле с именем пользователя.

    Почему в Quartz и Spring в выражении шесть полей?

    В Java-планировщиках первое поле — секунды, иногда в конце ещё и год. Выражение 0 0 3 * * ? из Spring в обычном crontab не заработает — уберите первое поле и замените ? на *: получится 0 3 * * *.

    Как временно отключить задачу?

    Поставьте # в начало строки через crontab -e — строка станет комментарием. Уберите #, чтобы включить обратно.

    Нужно ли перезапускать cron после изменений?

    Нет, если правили через crontab -e: cron проверяет изменения каждую минуту. После ручной правки файлов в /etc/cron.d/ перезапуск тоже обычно не нужен, но не повредит: sudo systemctl restart cron.

    Что дальше

    Чаще всего по расписанию запускают резервное копирование и обновления. Для сервера на Ubuntu пригодятся защита после установки — в ней есть автоматические обновления безопасности — и мониторинг температуры, который тоже удобно проверять по cron.

    Статья помогла?

    Комментарии

    Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.

    Комментарий появится после проверки. Ссылки и реклама не публикуются.