Cron: запуск задач по расписанию на сервере Linux

Боты, ИИ и автоматизация
Cron: запуск задач по расписанию на сервере Linux

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: пошагово

  1. Откройте таблицу заданий своего пользователя:
   crontab -e

При первом запуске система предложит выбрать редактор — для начала удобнее nano (обычно вариант 1).

  1. Добавьте строку с задачей. Например, запуск Python-скрипта каждый день в 03:00 с записью вывода в лог:
   0 3 * * * /usr/bin/python3 /home/user/scripts/report.py >> /home/user/logs/report.log 2>&1
  1. Сохраните файл (в nano — Ctrl+O, Enter, Ctrl+X). Cron подхватит изменения автоматически, перезапускать службу не нужно.
  1. Проверьте список задач:
   crontab -l
  1. Убедитесь, что задача отработала. Журнал планировщика в 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 без шаблонных ответов.

Читайте также