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 22.04 и 24.04
Nginx устанавливается на Ubuntu одной командой и начинает работать сразу после этого. Весь процесс — от чистого сервера до работающего сайта — занимает около десяти минут. Ниже разберём установку, настройку файрвола, создание виртуального хоста и основные команды для повседневной работы.…
Apache OFBiz: мощный и требовательный ERP-гигант
Если ваш бизнес — это сложный механизм с уникальными процессами, вы наверняка знаете, как трудно найти готовую программу, которая поможет все упорядочить и ничего не сломает по пути. Кто-то годами мирится с неудобной системой, кто-то платит за бесконечные доработки. Apache…