Cron — стандартный планировщик в Linux, который встречается в каждой инфраструктуре. Задачи сыплются, логи копятся, окружение подводит. Разберём, как настраивать cron надёжно и где он не подходит.
Когда cron нужен, а когда нет
Cron подходит для простых периодических задач: бэкапы, ротация логов, чистка временных файлов, периодические уведомления. Это демон, который спит между запусками — никаких ресурсов не ест.
Не используйте cron для:
задач, требующих миллисекундной точности (cron запускает с точностью до минуты)
задач с жёсткими зависимостями от других сервисов (systemd-юниты с After=)
долгих процессов, которые могут наложиться друг на друга (нужен lock)
Anatomy of a crontab entry
Формат строки:
* * * * * command
- - - - -
| | | | |
| | | | └── день недели (0-7, 0 и 7 = воскресенье)
| | | └──── месяц (1-12)
| | └────── день месяца (1-31)
| └──────── час (0-23)
└────────── минута (0-59)
Специальные значения:
@reboot — при загрузке
@yearly — раз в год (0 0 1 1 *)
@monthly — раз в месяц (0 0 1 * *)
@weekly — раз в неделю (0 0 * * 0)
@daily — раз в день (0 0 * * *)
@hourly — раз в час (0 * * * *)
Примеры:
0 3 * * * /opt/scripts/backup.sh # каждый день в 03:00
15,45 * * * * /usr/local/bin/check.sh # каждые 15 и 45 минут
0 */4 * * * /opt/metrics/collect.sh # каждые 4 часа
0 9-17 * * 1-5 /opt/reports/daily.sh # каждый час в рабочее время будней
crontab -e и crontab -l: типовые команды
crontab -l # показать текущий crontab пользователя
crontab -e # редактировать crontab (откроется в EDITOR)
crontab -r # удалить crontab (без подтверждения!)
crontab -l -u username # посмотреть crontab другого пользователя (от root)
crontab filename # загрузить задачи из файла
Примечание
По умолчанию редактор — vi. Изменить: export EDITOR=nano.
Где лежат системные расписания
Кроме пользовательских crontab, есть системные файлы:
/etc/crontab# системный crontab (формат отличается — есть поле пользователя)/etc/cron.d/# каталог для drop-in файлов/etc/cron.daily/# ежедневные задачи (run-parts)/etc/cron.hourly/# ежечасные задачи/etc/cron.monthly/# ежемесячные задачи/etc/cron.weekly/# еженедельные задачи/var/spool/cron/crontabs/# пользовательские crontab-файлы
Строки в /etc/crontab и /etc/cron.d/* содержат поле username:
#!/bin/bash
# /opt/scripts/run_backup.shsource /etc/profile
cd /opt/project ||exit1./backup.sh
Подсказка
Всегда проверяйте переменные: env | sort в терминале vs. задача * * * * * env | sort > /tmp/cron_env.txt.
Перенаправление вывода и ротация логов
По умолчанию cron отправляет вывод (stdout, stderr) пользователю по email. Если MAILTO="", письма отключаются.
# отправить вывод в файл03***/opt/scripts/backup.sh>>/var/log/backup.log2>&1# добавить дату в лог (читаемость)03***/opt/scripts/backup.sh>>/var/log/backup.log2>&1# rotate старых логов03***/opt/scripts/backup.sh>>/var/log/backup.log2>&1&& \
find/var/log-name"backup.log*"-mtime+7-delete