Gymterview
junior

Что такое cron и crontab?

cron — системный демон-планировщик в Unix/Linux, который выполняет команды по расписанию. crontab (cron table) — таблица расписаний конкретного пользователя, определяющая, какие команды и когда запускать.

Аналогия: cron — это будильник операционной системы, который может звонить по сложному расписанию: каждые 5 минут, каждый вторник в 3 часа ночи, первого числа каждого месяца и т. д.

Управление crontab

Пример
crontab -e          # Редактировать расписание текущего пользователя
crontab -l          # Показать текущие задачи
crontab -r          # Удалить все задачи (осторожно!)
crontab -u user -l  # Показать задачи другого пользователя (нужен root)

Формат записи cron

Пример
┌──────────── минуты (0-59)
│ ┌────────── часы (0-23)
│ │ ┌──────── день месяца (1-31)
│ │ │ ┌────── месяц (1-12)
│ │ │ │ ┌──── день недели (0-7, 0 и 7 = воскресенье)
│ │ │ │ │
* * * * * команда

Специальные символы

Символ Значение Пример
* Любое значение * * * * * — каждую минуту
, Перечисление 0 8,17 * * * — в 8:00 и 17:00
- Диапазон 0 9 * * 1-5 — будние дни в 9:00
/ Шаг */15 * * * * — каждые 15 минут

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

Пример
# Каждую минуту
* * * * * /opt/scripts/check.sh

# Каждые 5 минут
*/5 * * * * /opt/scripts/monitor.sh

# Каждый час в 0 минут
0 * * * * /opt/scripts/hourly.sh

# Ежедневно в 3:00
0 3 * * * /opt/scripts/backup.sh

# Каждый будний день в 9:00
0 9 * * 1-5 /opt/scripts/report.sh

# Каждое воскресенье в 2:00
0 2 * * 0 /opt/scripts/weekly-cleanup.sh

# Первое число каждого месяца в 6:00
0 6 1 * * /opt/scripts/monthly-report.sh

# Каждый рабочий день в 8:30 и 17:30
30 8,17 * * 1-5 /opt/scripts/notify.sh

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

Пример
@reboot    /opt/scripts/startup.sh     # При загрузке системы
@hourly    /opt/scripts/hourly.sh      # Каждый час (= 0 * * * *)
@daily     /opt/scripts/daily.sh       # Ежедневно (= 0 0 * * *)
@weekly    /opt/scripts/weekly.sh      # Еженедельно (= 0 0 * * 0)
@monthly   /opt/scripts/monthly.sh     # Ежемесячно (= 0 0 1 * *)
@annually  /opt/scripts/yearly.sh      # Ежегодно (= 0 0 1 1 *)

Окружение cron

Cron выполняет команды с минимальным окружением (не загружает .bashrc, .profile). Если команде нужны переменные (PATH, JAVA_HOME), задайте их явно:

Пример
JAVA_HOME=/usr/lib/jvm/java-17
PATH=/usr/local/bin:/usr/bin:/bin

0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

Всегда перенаправляйте вывод cron-задач в лог (>> file.log 2>&1), иначе вывод будет отправлен по электронной почте (если настроен MTA) или потерян.

Практические примеры для Java-разработчика

Пример
# Ротация логов каждую ночь
0 0 * * * find /var/log/myapp -name "*.log" -mtime +30 -delete

# Бэкап базы данных ежедневно в 2:00
0 2 * * * pg_dump -U postgres mydb | gzip > /backup/mydb_$(date +\%Y\%m\%d).sql.gz

# Health check каждые 5 минут с автоматическим рестартом
*/5 * * * * curl -sf http://localhost:8080/actuator/health > /dev/null || systemctl restart myapp

# Очистка временных файлов старше недели
0 4 * * * find /tmp -type f -mtime +7 -delete 2>/dev/null

На собеседовании: нарисуйте формат * * * * * (минуты, часы, день, месяц, день недели) и приведите 2-3 примера. Обязательно упомяните проблему окружения (cron не загружает .bashrc) и необходимость перенаправления вывода в лог. Вопрос-ловушка: «почему cron-задача работает из терминала, но не из crontab?» — обычно из-за отсутствия PATH или JAVA_HOME.