Cron в Ubuntu: Полное руководство по автоматизации задач для начинающих и профи

Cron в Ubuntu: Полное руководство по автоматизации задач для начинающих и профи

Представьте, что у вас есть личный цифровой помощник, который без напоминаний выполняет рутинные задачи: создаёт резервные копии, обновляет систему, отправляет отчёты или чистит временные файлы. Этот помощник существует и называется Cron — мощный планировщик задач в Linux-системах, включая Ubuntu. Освоив его, вы перестанете быть заложником повторяющихся действий и доверите их машине.

Что такое Cron и зачем он нужен?

Cron — это демон (фоновая служба), который выполняет команды по расписанию. Он читает конфигурационные файлы (crontab), где указано, что, когда и как запускать. Это не просто «напоминалка», а полноценный инструмент автоматизации системного администрирования, разработки и личного использования.

Cron работает даже если пользователь не авторизован в системе — это демон, который всегда «на страже».

Структура crontab: расшифровываем магию чисел

Каждая строка задачи в crontab состоит из пяти полей времени и самой команды:

* * * * * команда_для_выполнения
│ │ │ │ │
│ │ │ │ └─── День недели (0-7, где 0 и 7 = воскресенье)
│ │ │ └───── Месяц (1-12)
│ │ └─────── День месяца (1-31)
│ └───────── Час (0-23)
└─────────── Минута (0-59)

Примеры расписаний

  • 0 3 * * * — каждый день в 3:00 ночи
  • */15 * * * * — каждые 15 минут
  • 0 9 * * 1 — каждый понедельник в 9:00
  • 30 18 1 * * — первого числа каждого месяца в 18:30

Практика: настройка своей первой задачи

1. Редактирование crontab

Откройте редактор crontab для текущего пользователя:

crontab -e

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

2. Добавление задачи

В конец файла добавьте строку. Например, для ежедневного обновления системы в 4:30 утра:

30 4 * * * sudo apt update && sudo apt upgrade -y

Для команд, требующих sudo, может потребоваться настройка прав в файле /etc/sudoers или использование root-crontab (sudo crontab -e).

3. Просмотр и управление задачами

  1. crontab -l — список активных задач
  2. crontab -r — удаление всех задач (осторожно!)
  3. sudo systemctl status cron — проверка работы демона

Продвинутые техники

Перенаправление вывода

По умолчанию cron отправляет вывод на email. Лучше перенаправить его в файл или «в никуда»:

0 2 * * * /home/user/backup.sh > /var/log/backup.log 2>&1

Или для полного игнорирования вывода:

*/5 * * * * /script.sh > /dev/null 2>&1

Переменные окружения

Cron использует минимальное окружение. Указывайте полные пути и настраивайте переменные в начале crontab:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 * * * * /full/path/to/script.py

Системные задачи

Системные cron-задачи хранятся в /etc/cron.d/, /etc/cron.hourly/, /etc/cron.daily/ и других директориях. Для глобальных задач используйте их.

Отладка и решение проблем

Если задача не выполняется:

  • Проверьте логи: grep CRON /var/log/syslog
  • Убедитесь, что демон cron работает: sudo systemctl restart cron
  • Проверьте синтаксис на сайте-валидаторе crontab
  • Тестируйте команду вручную из-под того же пользователя

В Ubuntu 20.04+ cron пишет логи в journalctl: sudo journalctl -u cron

Альтернативы: systemd timers

В современных Ubuntu можно использовать systemd timers — более мощную, но сложную альтернативу. Они интегрированы с systemd, имеют лучшую журнализацию и зависимости между задачами.

FAQ: Частые вопросы о Cron в Ubuntu

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

Используйте шаг: */10 * * * * команда

Почему cron не видит переменные окружения?

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

Как выполнить задачу при перезагрузке?

Используйте @reboot вместо временных полей: @reboot /path/to/script

Можно ли использовать cron для задач с GUI?

Да, но нужно указать переменную DISPLAY: DISPLAY=:0 перед командой и использовать xhost для разрешений.

Где хранятся файлы crontab?

Пользовательские — в /var/spool/cron/crontabs/, системные — в /etc/cron.d/ и поддиректориях.