Gymterview
junior

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

cron — демон планирования периодических задач в Linux. Задачи описываются в файлах crontab.

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

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

Управление crontab

Пример
crontab -e                   # Редактировать задачи
crontab -l                   # Показать задачи
crontab -r                   # Удалить все задачи
sudo crontab -u appuser -e   # Задачи другого пользователя

Примеры

Пример
# Каждый день в 2:30 — бэкап БД
30 2 * * * /opt/scripts/backup-db.sh >> /var/log/backup.log 2>&1

# Каждые 5 минут — проверка здоровья приложения
*/5 * * * * curl -sf http://localhost:8080/actuator/health > /dev/null || systemctl restart myapp

# Каждый понедельник в 6:00 — очистка логов
0 6 * * 1 find /var/log/myapp -name "*.log" -mtime +30 -delete

# Каждые 10 минут с 9 до 18 в будни
*/10 9-18 * * 1-5 /opt/scripts/check-queue.sh

Специальные обозначения

Пример
@reboot     # При загрузке системы
@hourly     # Каждый час (= 0 * * * *)
@daily      # Каждый день (= 0 0 * * *)
@weekly     # Каждую неделю
@monthly    # Каждый месяц

Системные cron-каталоги

Путь Описание
/etc/crontab Системный crontab (с указанием пользователя)
/etc/cron.d/ Дополнительные файлы cron-задач
/etc/cron.hourly/ Скрипты каждый час
/etc/cron.daily/ Скрипты ежедневно
/etc/cron.weekly/ Скрипты еженедельно

Альтернатива: systemd timers

Пример
systemctl list-timers    # Все активные таймеры

Systemd-таймеры более гибкие и интегрированы с journald для логирования.

Важно

  • Cron запускает команды в минимальном окружении — переменные PATH, JAVA_HOME могут быть не установлены. Указывайте полные пути к исполняемым файлам
  • Логи cron: grep CRON /var/log/syslog или journalctl -u cron

На собеседовании: интервьюер может попросить написать cron-выражение для конкретного расписания. Частая ошибка — забыть, что cron работает в минимальном окружении без JAVA_HOME и PATH. Всегда указывайте полные пути: /usr/bin/java вместо java.