Практическое использование cron. Расписание задач в Linux от А до Я
cron — это стандартный планировщик задач в Linux, который позволяет запускать команды и скрипты по расписанию. Он работает в фоновом режиме и читает таблицы расписаний — crontab — от пользователей и системных служб. Если нужно автоматизировать регулярные задачи — бэкап, очистку логов, обновления, перезагрузку сервисов — cron подходит идеально.
В этой статье разберём cron так, чтобы вы могли уверенно пользоваться им в реальных сценариях.
Что такое crontab и где он хранится
У каждого пользователя в системе может быть свой crontab. Системный crontab находится в:
/etc/crontab
Пользовательские — в отдельном месте, не редактируются напрямую. Управление выполняется командами:
- Создать или отредактировать расписание пользователя:
crontab -e- Посмотреть расписание:
crontab -l- Удалить расписание:
crontab -rПользовательские таблицы хранятся в /var/spool/cron/crontabs/, но править их напрямую нельзя.
Формат строки cron: как это работает
Каждая строчка состоит из 5 полей + команда:
┌──────── минута (0-59)
│ ┌────── час (0-23)
│ │ ┌──── день месяца (1-31)
│ │ │ ┌── месяц (1-12)
│ │ │ │ ┌ день недели (0-7, где 0 и 7 — воскресенье)
│ │ │ │ │
* * * * * команда
Примеры:
0 3 * * * /usr/bin/backup # каждый день в 3:00
*/10 * * * * /root/check.sh # каждые 10 минут
30 7 * * 1-5 script.sh # по будням в 7:30
0 */2 * * * command # каждые 2 часа
15 4 1 * * job.sh # первого числа месяца в 4:15Специальные выражения cron
Удобные сокращения:
@reboot — запуск при загрузке системы
@yearly — раз в год (= "0 0 1 1 *")
@monthly — раз в месяц
@weekly — раз в неделю
@daily — каждый день
@hourly — каждый час
Пример:
@reboot /usr/local/bin/startup.sh
Важные моменты, которые ломают cron у новичков
1. Cron не знает про переменные окружения
Запуск в cron происходит в урезанном окружении. Часто забывают указать PATH.
Добавляем вручную:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Либо прописываем полный путь к бинарям:
/usr/bin/python3 script.py
2. Команда должна иметь абсолютные пути
Нельзя писать так:
python script.py
Нужно:
/usr/bin/python /home/user/script.py
3. Cron не выводит ошибки в терминал
Чтобы посмотреть ошибки, нужно писать лог:
*/5 * * * * /path/script.sh >> /var/log/script.log 2>&1
Как правильно писать задания в cron
Пример корректной строки:
0 2 * * * /usr/local/bin/backup.sh > /var/log/backup.log 2>&1
Если нужен запуск через bash:
0 2 * * * /bin/bash /root/run.sh
Полезно добавлять cd, если скрипт зависит от директории:
0 1 * * * cd /var/www/project && ./deploy.sh
Примеры реальных задач
1. Автоматический бэкап базы MySQL
0 3 * * * /usr/bin/mysqldump -u root -p'PASSWORD' db > /backups/db_$(date +\%F).sql
2. Очистка логов старше 7 дней
0 0 * * * find /var/log/myapp -type f -mtime +7 -delete
3. Перезапуск сервиса раз в сутки
0 4 * * * systemctl restart nginx
4. Проверка, что приложение запущено
*/5 * * * * pgrep myapp >/dev/null || systemctl start myapp
5. Сжатие логов каждые выходные
0 1 * * 0 gzip /var/log/mylog.log
Cron и скрипты: рекомендуемая структура
Напишите скрипт аккуратно:
#!/bin/bash
set -e
LOG="/var/log/mytask.log"
echo "Started: $(date)" >> $LOG
# Основная логика
do_something
echo "Finished: $(date)" >> $LOGИ уже его вызывайте в cron.
Проверка работы cron
Посмотреть системные логи:
systemd-based системы:
journalctl -u cronили
journalctl -u crondЛог конкретных задач:
/var/log/syslog
фильтр:
grep CRON /var/log/syslogСистемный cron vs пользовательский cron
/etc/crontab имеет другой формат.
Там есть дополнительное поле — имя пользователя, от чьего имени выполнять задачу:
* * * * * user /path/script.sh
В /etc/cron.d/ лежат модульные файлы пакетов — например, nginx, certbot, logrotate.
Как временно отключить cron-задачу
Просто закомментируйте строчку в crontab:
# 0 3 * * * /script.sh
Либо удалите файл в /etc/cron.d/.
Cron и права пользователей
Проверить, кому разрешено использовать cron:
/etc/cron.allow
/etc/cron.deny
Если cron.allow существует — пользоваться могут только перечисленные пользователи.
Альтернатива cron: systemd timers
Если вы используете современные дистрибутивы Linux, то вместо cron можно применять systemd timers — встроенный механизм планирования задач в systemd. Таймеры позволяют более гибко управлять расписанием, зависимостями сервисов, логированием и перезапусками. Это особенно удобно для задач, которые должны стартовать как полноценные systemd-сервисы.
У нас уже есть отдельная статья про systemd, где подробно разобрана структура юнитов.
Вывод
Cron — мощный и простой инструмент планирования задач в Linux.
Он идеально подходит для автоматизации рутинных задач:
- бэкапов
- мониторинга
- очистки логов
- запуска сервисов
- выполнения скриптов
Если соблюдать несколько правил — указывать абсолютные пути, фиксировать окружение, логировать работу — cron становится полностью предсказуемым и стабильным.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний