Cron — штатный планировщик задач в Linux, который запускает команды по расписанию: каждые пять минут, раз в сутки, по понедельникам в 9:00 — как настроите. Настройка cron занимает пару минут, а взамен вы получаете автоматизацию всего, что раньше делали руками: бэкапы, очистку логов, запуск парсеров, отправку отчётов, продление сертификатов. В этой статье разберём синтаксис crontab на рабочих примерах для Ubuntu 24.04 LTS, научимся читать журналы планировщика и обойдём типичные грабли, из-за которых задачи по расписанию «молча» не выполняются.
Единственное требование — сервер, который работает круглосуточно. Домашний компьютер на эту роль не подходит: cron не запустит задачу, если машина выключена или ушла в сон.
Как устроен cron: демон, crontab и расписание
Cron состоит из двух частей:
- Демон cron — фоновая служба, которая раз в минуту проверяет таблицы заданий и запускает те, чьё время пришло.
- Crontab (cron table) — таблица заданий. У каждого пользователя своя, плюс есть системная
/etc/crontabи каталоги/etc/cron.d,/etc/cron.daily,/etc/cron.hourly.
В Ubuntu 24.04 cron обычно уже установлен. Проверить и при необходимости доустановить:
sudo apt update
sudo apt install -y cron
sudo systemctl enable --now cron
systemctl status cron
Если в статусе видите active (running) — планировщик готов к работе. Осталось подключиться к серверу (как это сделать — в статье о подключении к VPS по SSH) и добавить первую задачу.
Синтаксис cron: пять полей, которые нужно запомнить
Каждая строка crontab — это расписание из пяти полей плюс команда:
┌───────── минута (0–59)
│ ┌─────── час (0–23)
│ │ ┌───── день месяца (1–31)
│ │ │ ┌─── месяц (1–12)
│ │ │ │ ┌─ день недели (0–7, 0 и 7 — воскресенье)
│ │ │ │ │
* * * * * команда
Звёздочка означает «любое значение». Кроме неё используются:
*/5— каждые 5 единиц (минут, часов);1,15— перечисление: 1-е и 15-е число;9-18— диапазон: с 9 до 18 часов;@reboot,@daily,@hourly,@weekly,@monthly— короткие псевдонимы вместо пяти полей.
Примеры расписаний, которые покрывают 90% реальных задач:
| Запись | Когда выполняется |
|---|---|
/5 * | Каждые 5 минут |
0 | Каждый час, в 00 минут |
30 3 * | Ежедневно в 03:30 |
0 9 1-5 | По будням в 09:00 |
0 0 1 | Первого числа каждого месяца в полночь |
@reboot | Один раз при загрузке сервера |
Важный нюанс: время интерпретируется в часовом поясе сервера. Проверьте его командой timedatectl и при необходимости смените: sudo timedatectl set-timezone Europe/Moscow.
Настройка cron на Ubuntu 24.04: пошагово
- Откройте таблицу заданий своего пользователя:
crontab -e
При первом запуске система предложит выбрать редактор — для начала удобнее nano (обычно вариант 1).
- Добавьте строку с задачей. Например, запуск Python-скрипта каждый день в 03:00 с записью вывода в лог:
0 3 * * * /usr/bin/python3 /home/user/scripts/report.py >> /home/user/logs/report.log 2>&1
- Сохраните файл (в nano — Ctrl+O, Enter, Ctrl+X). Cron подхватит изменения автоматически, перезапускать службу не нужно.
- Проверьте список задач:
crontab -l
- Убедитесь, что задача отработала. Журнал планировщика в Ubuntu 24.04 удобнее всего смотреть через journalctl:
journalctl -u cron -n 50 --no-pager
В журнале видно, какую команду и когда запускал cron; результат работы самого скрипта ищите в лог-файле, который вы указали после >>.
Конструкция >> файл 2>&1 дописывает в лог и обычный вывод, и ошибки — без неё вы не узнаете, почему скрипт упал.
Практические примеры cron-задач
Несколько готовых строк под типовые сценарии — подставьте свои пути:
# Бэкап базы MySQL каждую ночь в 02:15
15 2 * * * /usr/bin/mysqldump -u backup -p'пароль' mydb | gzip > /home/user/backups/mydb-$(date +\%F).sql.gz
# Удаление бэкапов старше 14 дней — в 02:45
45 2 * * * /usr/bin/find /home/user/backups -name "*.sql.gz" -mtime +14 -delete
# Синхронизация каталога на другой сервер каждый час
0 * * * * /usr/bin/rsync -az /var/www/ user@backup-host:/backups/www/
# Прогрев кеша сайта каждые 10 минут
*/10 * * * * /usr/bin/curl -s -o /dev/null https://example.com/
# Перезапуск скрипта после перезагрузки сервера
@reboot /usr/bin/python3 /home/user/bot/main.py >> /home/user/logs/bot.log 2>&1
Обратите внимание на \%F в первой строке: знак процента в crontab — спецсимвол (означает перевод строки), поэтому внутри команд его нужно экранировать обратным слэшем.
Если задача — это постоянно работающий процесс (бот, воркер), а не разовый запуск, cron с @reboot — лишь запасной вариант. Правильнее оформить процесс как службу — подробности в статьях о запуске Python-скриптов 24/7 и о создании собственных служб systemd. А стратегию резервного копирования целиком мы разобрали в материале о бэкапах VPS по схеме 3-2-1.
Почему задача не запускается: типичные ошибки
Cron лаконичен: если задача не выполнилась, он не покажет ошибку на экране. Вот причины, на которые приходится большинство обращений:
- Относительные пути. Cron запускает команды из домашнего каталога с минимальным окружением. Пишите абсолютные пути и к интерпретатору (
/usr/bin/python3), и к скрипту, и к файлам, которые скрипт открывает. - Пустой PATH. По умолчанию cron видит только
/usr/bin:/bin. Если команда лежит в другом месте, задайте PATH первой строкой crontab:PATH=/usr/local/bin:/usr/bin:/bin. - Нет прав на файл. Скрипт должен быть исполняемым (
chmod +x script.sh) либо запускаться через интерпретатор явно. - Виртуальное окружение Python не активировано. Вместо активации venv укажите питон из окружения напрямую:
/home/user/project/venv/bin/python /home/user/project/main.py. - Неэкранированный
%— команда обрывается на первом проценте. - Задачи «наслаиваются». Если скрипт работает дольше интервала запуска, копии накапливаются. Лечится обёрткой
flock:/5 * /usr/bin/flock -n /tmp/job.lock /home/user/job.sh— новая копия не стартует, пока работает предыдущая.
Быстрый способ отладки — временно поставить расписание * (каждую минуту), смотреть лог и журнал journalctl -u cron -f, а после отладки вернуть боевое расписание.
Где запускать задачи по расписанию: сервер вместо домашнего ПК
Cron полезен ровно настолько, насколько стабильно работает машина под ним. Выключили компьютер на ночь — ночной бэкап не случился. Поэтому задачи по расписанию логично выносить на VPS, который работает без остановок.
Самому cron ресурсы почти не нужны — считайте требования своих скриптов. Для лёгкой автоматизации (бэкапы, парсеры на requests, отчёты, пинг сайтов) достаточно NAT VPS у Cheap-Host: тариф NAT Start за 59 ₽/мес даёт 1 vCPU, 1 ГБ RAM и 10 ГБ NVMe — с безлимитным трафиком и uptime 99,9%, то есть расписание не «поедет» из-за простоев. Сервер выдаётся автоматически за 45–60 секунд: заказали, получили SSH-доступ, добавили строки в crontab — автоматизация работает. Если задачи подрастут, тариф NAT Pro (2 vCPU, 4 ГБ RAM, 199 ₽/мес) закроет и параллельные запуски.
FAQ
Можно ли запускать задачу чаще, чем раз в минуту?
Нет, минимальный шаг cron — одна минута. Если нужно чаще, добавьте в минутную задачу цикл со sleep или используйте systemd-таймеры с секундной точностью.
Почему скрипт работает в терминале, но не из cron?
Почти всегда дело в окружении: у cron минимальный PATH и нет переменных вашей сессии. Проверьте абсолютные пути, задайте PATH в crontab и направьте вывод в лог через >> файл 2>&1 — в нём будет текст ошибки.
Что будет, если сервер был выключен в момент запуска задачи?
Классический cron пропустит запуск и не будет его «догонять». Для обязательных задач используйте anacron (ежедневные/еженедельные) или systemd-таймер с Persistent=true. На VPS с uptime 99,9% эта проблема практически не возникает.
Чем cron отличается от systemd-таймеров?
Cron проще: одна строка — одна задача. Таймеры systemd умеют больше: зависимости между службами, лимиты ресурсов, догон пропущенных запусков, единые журналы. Для типовых бэкапов и скриптов достаточно cron.
Какой сервер нужен для cron-задач?
Ресурсы определяются вашими скриптами, а не самим планировщиком. Лёгкой автоматизации хватает NAT VPS от 59 ₽/мес; если скрипты тяжёлые — берите тариф с запасом RAM, апгрейд у Cheap-Host выполняется без потери данных.
Вывод
Cron — самый быстрый способ автоматизировать рутину на сервере: пять полей расписания, команда, лог — и задача выполняется сама, годами. Начните с одной строки в crontab -e, приучите себя всегда писать абсолютные пути и перенаправлять вывод в лог — и 90% проблем с задачами по расписанию обойдут вас стороной. Если для автоматизации нужен круглосуточный сервер — у Cheap-Host NAT VPS от 59 ₽/мес: NVMe, безлимитный трафик, выдача сервера за минуту и поддержка 24/7 без шаблонных ответов.