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.