Top.Mail.Ru

Cron в Linux: автоматизация задач — полное руководство

2
Cron в Linux: автоматизация задач — полное руководство

Cron — планировщик задач в Linux, который запускает команды и скрипты по расписанию. Чтобы добавить задачу, достаточно одной строки в специальном файле — crontab. После сохранения cron подхватывает изменения автоматически и больше не требует вашего участия.

Как работает cron

Демон cron запускается при старте системы и каждую минуту проверяет расписания в crontab-файлах. Если текущее время совпадает с указанным — задача выполняется. Это всё: никаких фоновых процессов, никаких блокировок — просто проверка раз в минуту.

В большинстве дистрибутивов cron работает из коробки. Проверить статус:

sudo systemctl status cron

На CentOS и AlmaLinux сервис называется иначе:

sudo systemctl status crond

Если сервис не запущен, включить его:

sudo systemctl enable --now cron

Синтаксис crontab

Каждая строка в crontab — это одна задача. Формат:

минута час день_месяца месяц день_недели команда

Пять полей времени, затем команда. Вот что означает каждое поле:

Поле Значение Допустимый диапазон
Минута В какую минуту запускать 0–59
Час В какой час (24-ч формат) 0–23
День месяца Какого числа месяца 1–31
Месяц В каком месяце 1–12
День недели В какой день недели 0–7 (0 и 7 — воскресенье)

Символ * в любом поле означает «каждый». Несколько значений разделяются запятой, диапазон — дефисом, шаг — косой чертой.

Специальные строки расписания

Кроме цифровых полей, cron понимает несколько удобных коротких форм:

Строка Значение Аналог
@reboot При каждом запуске системы
@hourly Раз в час 0 * * * *
@daily Раз в сутки в полночь 0 0 * * *
@weekly Раз в неделю в воскресенье в полночь 0 0 * * 0
@monthly Раз в месяц первого числа в полночь 0 0 1 * *
@yearly Раз в год 1 января в полночь 0 0 1 1 *

@reboot особенно полезен для скриптов, которые должны стартовать вместе с сервером — например, запуск VPN-туннеля или очистка временных файлов.

Управление crontab

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

crontab -e

При первом запуске система спросит какой редактор использовать. Для новичков лучше выбрать nano — он проще в управлении чем vim.

Посмотреть текущие задачи без редактирования:

crontab -l

Удалить весь crontab текущего пользователя:

crontab -r

Будьте осторожны с -r — подтверждения не запрашивается, все задачи удаляются мгновенно. Если хотите удалить одну задачу — откройте через -e и удалите нужную строку.

Просмотреть crontab другого пользователя (от root):

sudo crontab -u username -l

Практические примеры

Бэкап базы данных каждую ночь в 3:00:

0 3 * * * mysqldump -u root -pПАРОЛЬ mydb > /backup/mydb-$(date +\%F).sql

Запуск Python-скрипта каждые 5 минут:

*/5 * * * * /usr/bin/python3 /home/user/scripts/monitor.py

Очистка временных файлов каждую субботу в 4:00:

0 4 * * 6 find /tmp -type f -mtime +7 -delete

Перезапуск приложения каждый день в 6:00:

0 6 * * * systemctl restart myapp

Запуск скрипта при старте сервера:

@reboot /home/user/scripts/startup.sh

Отчёт каждый первый день месяца в 9:00:

0 9 1 * * /home/user/scripts/monthly-report.sh

Главная ловушка: PATH и переменные окружения

Это самая частая причина почему cron-задача работает в терминале, но не работает по расписанию.

Когда вы запускаете команду в терминале, оболочка наследует переменные окружения вашего профиля: полный PATH, переменные для Python, Node.js, Ruby и всего остального. У cron своя среда — очень скудная. По умолчанию PATH в cron выглядит так:

PATH=/usr/bin:/bin

Это значит, что команда python3 может не найтись, если Python установлен в /usr/local/bin. Команда npm не найдётся вовсе, если она в /usr/local/bin/npm.

Есть два способа решить проблему.

Способ 1 — указывать полный путь к команде:

*/5 * * * * /usr/local/bin/python3 /home/user/script.py

Узнать полный путь к нужной команде:

which python3
which npm
which node

Способ 2 — задать PATH прямо в начале crontab:

PATH=/usr/local/bin:/usr/bin:/bin

*/5 * * * * python3 /home/user/script.py
0 3 * * * npm run build >> /var/log/build.log 2>&1

Эта строка применяется ко всем задачам в crontab. Второй способ удобнее если задач много.

Аналогично с другими переменными окружения — HOME, LANG, JAVA_HOME и прочими. Если скрипт зависит от них, задайте их явно в crontab.

Логирование вывода задач

По умолчанию cron пытается отправить вывод задачи на email системного пользователя. Если почта не настроена, вывод просто теряется — это создаёт иллюзию что задача не работает.

Чтобы видеть что происходит, перенаправьте вывод в файл:

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

Здесь >> добавляет вывод в конец файла (не перезаписывает), а 2>&1 дополнительно перенаправляет ошибки (stderr) туда же. Без 2>&1 ошибки не попадут в лог и вы их не увидите.

Чтобы полностью отключить email-уведомления от cron (актуально если почта не настроена):

MAILTO=""

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

Строку MAILTO="" пишите в начале crontab.

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

Посмотреть логи cron за сегодня:

grep CRON /var/log/syslog | tail -20

На некоторых системах логи cron в отдельном файле:

sudo tail -f /var/log/cron.log

В логах видны записи о каждом запуске задачи — время, пользователь и команда. Если задача запускалась — запись будет. Если записи нет — значит расписание составлено неверно или cron не запущен.

Проверить синтаксис расписания онлайн можно на crontab.guru — сервис показывает читаемое описание выражения и следующее время срабатывания.

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

Кроме пользовательских crontab, в системе есть несколько мест для системных задач.

/etc/crontab — главный системный crontab. В отличие от пользовательского, здесь есть дополнительное поле — имя пользователя от которого запускается команда:

0 3 * * * root /usr/local/bin/backup.sh

/etc/cron.d/ — директория для crontab-файлов отдельных приложений. Пакеты часто кладут свои задачи сюда при установке.

/etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ — папки со скриптами. Достаточно положить исполняемый скрипт в нужную папку — cron запустит его в соответствующий период.

Скрипт должен быть исполняемым:

chmod +x /etc/cron.daily/my-script.sh

Часто задаваемые вопросы

Как запустить задачу cron только в рабочие дни?

Укажите 1-5 в поле дня недели (понедельник — пятница):

0 9 * * 1-5 /home/user/scripts/workday-task.sh

Почему скрипт работает вручную, но не работает в cron?

Почти всегда причина в переменных окружения или PATH. Добавьте в начало crontab строку PATH=/usr/local/bin:/usr/bin:/bin или используйте полные пути к командам. Также убедитесь, что скрипт имеет права на исполнение (chmod +x).

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

Используйте шаг через косую черту:

*/10 * * * * /home/user/check.sh

Как проверить, работает ли cron?

Выполните sudo systemctl status cron (или crond на CentOS). Статус должен быть active (running). Также проверьте логи: grep CRON /var/log/syslog | tail -20 — там будут записи о каждом запуске.

Можно ли ограничить, каким пользователям разрешён cron?

Да. Создайте файл /etc/cron.allow со списком пользователей (по одному на строку) — только они смогут использовать crontab. Если файл /etc/cron.deny существует без cron.allow — в нём перечислены запрещённые пользователи. Если ни одного файла нет — cron доступен всем.

Автоматизация задач через cron — одно из первых что настраивают на новом VPS: бэкапы, мониторинг, обновление сертификатов. На UFO.Hosting каждый сервер работает под Ubuntu или Debian, где cron доступен сразу после подключения по SSH.

Проверить синтаксис расписания: crontab.guru

Похожее

Все статьи
nginx установка на ubuntu

Nginx: установка и настройка на Ubuntu 22.04 и 24.04

Nginx устанавливается на Ubuntu одной командой и начинает работать сразу после этого. Весь процесс — от чистого сервера до работающего сайта — занимает около десяти минут. Ниже разберём установку, настройку файрвола, создание виртуального хоста и основные команды для повседневной работы.…

2151937262

Apache OFBiz: мощный и требовательный ERP-гигант

Если ваш бизнес — это сложный механизм с уникальными процессами, вы наверняка знаете, как трудно найти готовую программу, которая поможет все упорядочить и ничего не сломает по пути.  Кто-то годами мирится с неудобной системой, кто-то платит за бесконечные доработки. Apache…