Генератор cron: расписание для crontab с проверкой
Генератор cron-выражений: введите расписание или выберите готовое — увидите, что оно значит по-русски, и даты ближайших запусков. Готовая строка для crontab, команда добавления и таймер systemd. Плюс синтаксис cron, примеры и частые ошибки.
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 | ровно N | 30 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 не срабатывает
Скрипт из терминала работает, а по расписанию — нет. Почти всегда дело в одном из пунктов:
- Другое окружение. Cron запускает команды с минимальным
PATH(/usr/bin:/bin) и без ваших настроек из.bashrc. Пишите полные пути:/usr/bin/python3,/usr/local/bin/rclone. Узнать путь к программе —which rclone. Либо задайтеPATH=первой строкой crontab. - Знак
%. В crontab он означает перевод строки. Командаdate +%Y-%m-%dоборвётся на первом проценте — экранируйте его:date +\%Y-\%m-\%d. Генератор делает это автоматически. - Нет прав на запуск. Скрипт должен быть исполняемым (
chmod +x backup.sh, подробнее — в калькуляторе chmod) и начинаться со строки#!/bin/bash. - Ошибки никто не видит. Вывод задачи по умолчанию уходит на локальную почту, которой обычно нет. Добавьте в конец строки
>> $HOME/cron.log 2>&1— генератор делает это, если стоит галочка «записывать вывод в лог». - Часовой пояс. 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.shCron или таймер 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.
Если статья пригодилась — отметьте, это помогает выбирать темы
Статья помогла?
Комментарии
Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.