Что такое 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.