Практическое использование cron. Расписание задач в Linux от А до Я

10 минут чтения
Средний рейтинг статьи — 4.9

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 становится полностью предсказуемым и стабильным.

10 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний