Cron — это планировщик задач, работающий в Unix-подобных операционных системах, включая все дистрибутивы Linux. Демон cron работает на сервере в фоновом режиме и запускает по расписанию запланированные задачи. В этой статье мы рассмотрим установку cron на сервер с Linux CentOS 8, познакомимся с синтаксисом cron, научимся добавлять в него различные задачи, управлять расписанием запуска.
Установка cron в Linux
По умолчанию cron доступен при установке CentOS 8. Если же у вас по каким-то причинам он отсутствует, вы можете установить его из базового репозитория с помощью yum / dnf:
# dnf update -y
— обновить все ПО на сервере
# dnf install crontabs -y
— установите cronВ моем случае cron уже был установлен:
После установки, демон crond нужно добавить в автозагрузку и запустить:
# systemctl enable crond.service
# systemctl start crond.service
Crontab: добавление задания в планировщик cron
Для добавления задач в cron можно использовать команду:
# crontab -e
Данная команда откроет файл для задач для вашего пользователя в текстовом редакторе по-умолчанию (у меня это vi, но можно изменить на удобный для вас, например nano). Настройка заданий таким способом исключает, что вы допустите ошибку в синтаксисе. Редактор crontab просто не даст сохранить файл с ошибками.
Также можно отредактировать файл заданий cron вручную через mc:
# mcedit /var/spool/cron/root
– имя файла может отличаться, в зависимости от того, под каким пользователем вы работаете.
Чтобы добавить простое задание по запуск bash скрипта в cron, выполните:
# crontab -e
Теперь добавьте расписание задания и путь к файлу скрипта:
* * * * * /root/test.sh
Сохраните файл (редактирование файла по аналогии с редактором vim: сохранить Ctrl+O и выйти Ctrl+x).
Если все сделали верно, ваше задание будет добавлено. Чтобы вывести список заданий cron, выполните:
# cat /var/spool/cron/root
* * * * * /root/test.sh
Или так:
# crontab -l
Данный скрипт будет запускаться через cron ежеминутно.
/etc/crontab /etc/cron.*/. /var/spool/cron/
Каждая запись расписания crontab состоит из 5 полей:
минуты часы день_месяца месяцы день_недели
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Можно использовать следующие допустимые значения для каждого из полей:
Поле | Диапазон значений |
минуты |
0-59
|
часы |
0-23
|
день месяца |
1-31
|
месяц |
1-12
или
jan feb mar apr may jun jul aug sep oct nov dec
|
день недели |
0-6
(где 0 это воскресение) или
sun mon tue wed thu fri sat
|
Знак * означает все допустимые значения. Пример задания:
15 00 * * 1 /root/test.sh
Указанный в задании скрипт, будет запускаться каждый понедельник в 00 часов 15 минут. Для упрощения синтаксиса cron-файла используют специальные символы:
Запятая (,) : запятой разбиваются значения расписания для выполнения одинаковой задачи, но в разное время. Например, если вам нужно выполнять задачу в 15 и 30 минут, вы можете задать расписание так:
15 * * * * 30 * * * *
Или исползовать более короткий синтаксис с запятой:
15,30 * * * *
Слеш (/) : использовать косую черту можно для выражения какого-либо шага. Например, вам нужно запускать какую-то задачу каждые 2 часа. В обычном написании файл cron будет громоздким, используя / вы заметно сократите содержимое cron файл:
* */2 * * *
Дефис (-) : дефис указывает диапазон значений в поле. Если вы хотите запускать задание первые 10 минут или последние 10 минут, укажите диапазон через дефис:
0-10 * * * * 50-60 * * * *
Еще несколько примеров расписаний для cron:
- запуск по будням в 12:00 и 18:00:
0 12,18 * * 1-5
- каждые 30 минут:
*/30 * * * *
- каждую субботу:
0 0 * * 6
- каждый вторник и четверг в 2:00 ночи:
0 2 * * 2,4
Еще в cron можно использовать специальные переменные.
Переменная | Описание | Эквивалент |
@reboot | Запускается один раз при загрузке | |
@yearly или @annually
| один раз в год |
0 0 1 1 *
|
@monthly | один раз в месяц |
0 0 1 * *
|
@weekly | один раз в неделю |
0 0 * * 0
|
@daily | один раз в день |
0 0 * * *
|
@hourly | ежечасно | 0 * * * * |
@midnight | В полночь |
Т.е. для запуска задания раз в день можно использовать формат:
@daily echo "Проверка cron"
Можно отредактировать cron файл другого пользователя:
# crontab -u username
Отправка уведомлений cron на e-mail
Если вы хотите получать информацию о выполнении ваших задач cron по почте, нужно выполнить настройку cron-файла с задачами.
# dnf install sendmail -y
# service sendmail start
sendmail – бесплатный агент для передачи почты, который доступен практически для любой операционной системе.
Настроем параметры отправки e-mail в cron-файле. Добавьте в файл следующие строки:
MAILTO="*@gmail.com" SHELL=/bin/bash HOME=/ * * * * * echo "Проверка cron"
MAILTO — укажите свой почтовый ящик
SHELL — оболочка пользователя
HOME — путь к файлу cron
После каждого запуска задачи на указанный email отправляется уведомление:
Информацию о запуске задания cron можно сохранять в лог-файл. Для этого, в конце задания нужно добавить >> и указать путь до лог-файла:
* * * * * echo "Проверка cron" >> /var/log/admin/journal.log
Если в вашем cron-файле добавлено много заданий и результат выполнения каких-то из них, не нужно отправлять на почту, данные задания вы можете запускать в «бесшумном» режиме:
* * * * * echo "Проверка cron" >> /dev/null 2>&1
Таким образом вы можете отделить некоторые задания, чтобы не отправлять уведомления о всех задания себе на почтовый ящик.
Файлы конфигурации и логи планировщика cron
Основной файл конфигурации демона cron — /etc/crontab. Помимо cron-файла, задачи можно запускать из следующих директорий:
- /etc/cron.daily – запуск скриптов один раз в день
- /etc/cron.hourly – запуск скриптов ежечасно
- /etc/cron.monthly – запуск скриптов раз в месяц
- /etc/cron.weekly – запуск скриптов раз в неделю
Просто разместите нужны скрипты в нужную директорию, и они будут выполняться согласно расписания.
Можно ограничить доступ к планировщику с помощью файлов /etc/cron.allow и /etc/cron.deny. Достаточно создать эти файлы и добавить в него пользователей, которым, соотвественно, разрешено и запрещено запускать задания cron.
В файл /etc/crontab тоже можно помещать задания. Обычно данный файл используется root пользователем или для настройки системных задач. Личные файлы пользователей для cron заданий, хранятся в директории /var/spool/cron/ или /var/cron/tabs/.
Чтобы отследить выполнение задач или отследить ошибки, можно обратиться к лог-файлу /var/log/cron. В данном файле фиксируется запуск всех задач и ошибки в работе демона, если они есть: