Глава 35. Автоматизация задач

В Linux вы можете настроить автоматический запуск заданий в опредёлённый период времени, в определённый день или в момент, когда средняя нагрузка системы опускается ниже заданного значения. В Red Hat Enterprise Linux предварительно настроены важные системные задачи для поддержания актуального состояни системы. Например, база данных slocate, используемая командой locate, обновляется ежедневно. Системный администратор может использовать автоматизацию для выполнения периодического резервного копирования, наблюдения за системой, запуска собственных сценариев и т. д.

В Red Hat Enterprise Linux включены несколько утилит автоматизации задач: cron, at и batch.

35.1. Cron

Cron — это демон, который можно использовать для назначения запуска повторяющихся заданий по расписанию, задаваемого по времени, дню месяца, месяцу, дню недели и неделям.

Cron подразумевает, что система работает непрерывно. Если система не была включена в момент, на который была назначено задание, оно не будет выполнено. За информацией о назначении одноразовых заданий, обратитесь к разделу 35.2 Задания at и batch.

Для использования службы cron, необходимо, чтобы был установлен RPM-пакет vixie-cron и работала служба crond. Чтобы определить, установлени ли этот пакет, выполните команду rpm -q vixie-cron. Чтобы определить, работает ли служба, воспользуйтесь командой /sbin/service crond status.

35.1.1. Настройка заданий cron

Основной файл конфигурации cron, /etc/crontab, содержит следующие строки:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

Первые четыре строки — это переменные, настраивающие окружение, в котором будут работать задачи cron. Переменная SHELL сообщает системе, какую оболочку использовать (в данном примере это оболочка bash), а переменная PATH определяет пути, используемые при выполнении команд. Результат выполнения задач cron будет выслан по электронной почте пользователю, определённому в переменной MAILTO. Если в качестве значения переменной MAILTO задана пустая строка (MAILTO=""), электронные письма не отправляются. Переменная HOME задаёт домашний каталог, используемый при выполнении команд или сценариев.

Каждая строка в файле /etc/crontab представляет отдельное задание и имеет следующий формат:

minute   hour   day   month   dayofweek   command

  • minute — любое целое число от 0 до 59

  • hour — любое целое от 0 до 23

  • day — любое целое от 1 до 31 (день должен быть допустимым, если задан месяц)

  • month — любое целое от 1 до 12 (или краткое название месяца, например, jan, feb и т. д.)

  • dayofweek — любое целое от 0 до 7, где 0 или 7 обозначает воскресенье (или краткое название дня недели, например, sun или mon)

  • command — выполняемая команда (это может команда вроде ls /proc >> /tmp/proc или команда, запускающая дополнительный сценарий)

Для любых указанных выше параметров можно использовать звездочку (*), что означает все допустимые значения. Например, если поставить звёздочку в значении месяца, команда будет выполняться каждый месяц в день, определённый другими параметрами.

Дефис (-) между целыми числами обозначает диапазон чисел. Например, 1-4 обозначает набор целых чисел 1, 2, 3 и 4.

Последовательность значений, разделенных запятыми (,), обозначает список. Например, перечисление 3, 4, 6, 8 обозначает четыре указанных целых числа.

Прямая косая черта (/) используется для определения шага значений. Число в диапазоне может быть пропущено, если после диапазона указать /<целое>. Например, значение поля минут 0-59/2, определяет, что будет пропущена каждая вторая минута. В качестве шага значений также может быть указана звёздочка. Например, чтобы запускать задание раз в три месяца, в поле месяца можно использовать значение */3

Любые строки, начинающиеся с символа решетки (#), являются комментариями и не обрабатываются.

Как показывает пример файла /etc/crontab, сценарий run-parts запускает сценарии в каталогах /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ каждый час, день, неделю, месяц соответственно. Файлы в этих каталогах должны быть сценариями оболочки.

Если задание cron нужно выполнить по расписанию, но не ежечасно, ежедневно, еженедельно или ежемесячно, его можно добавить в каталог /etc/cron.d. Все файлы в этом каталоге имеют тот же синтаксис, что и /etc/crontab. Примеры заданий показаны в примере 35-1.

# записывает данные об использовании памяти в системе каждый понедельник
# в 3:30 в файл /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# запускает специальный сценарий каждый день каждого месяца в 4:10
10 4 1 * * /root/scripts/backup.sh

Пример 35-1. Пример заданий crontab

Другие пользователи (не root) также могут настраивать задачи cron, используя программу crontab. Все созданные пользователями файлы crontab хранятся в каталоге /var/spool/cron/ и выполняются от имени создавшего их пользователя. Чтобы создать файл crontab для пользователя, войдите в систему под его именем и введите команду crontab -e, чтобы отредактировать его файл crontab с помощью редактора, указанного в переменной окружения VISUAL или EDITOR. Этот файл имеет тот же формат, что и /etc/crontab. При записи изменений файла crontab этот файл сохраняется под названием /var/spool/cron/username, в соответствии с именем пользователя.

Демон cron проверяет наличие изменений в файле /etc/crontab, каталоге /etc/cron.d/ и каталоге /var/spool/cron/ каждую минуту. Если обнаруживаются какие-либо изменения, они загружаются в память. Таким образом, демон не нуждается в перезапуске при изменении файла crontab.

35.1.2. Управление доступом к cron

Для ограничения доступа к cron используются файлы /etc/cron.allow и /etc/cron.deny. Формат списков управления доступом в обоих файлах прост — в каждой строке файла указывается одно имя пользователя. Пробельные символы в этих файлах не допускаются. Перезапускать демон cron (crond) после изменения файлов управления доступом не требуется. Файлы управления доступом обрабатываются каждый раз, когда пользователь пытается добавить или удалить задание cron.

Пользователь root может использовать cron, вне зависимости от того, какие пользователи перечислены в файлах управления доступом.

Если файл cron.allow существует, использовать cron разрешено только перечисленным в нём пользователям, а файл cron.deny игнорируется.

Если cron.allow не существует, пользователям, перечисленным в cron.deny, использовать cron не разрешается.

35.1.3. Запуск и остановка службы

Чтобы запустить службу cron, выполните команду /sbin/service crond start. Чтобы остановить её, выполните команду /sbin/service crond stop. Рекомендуется настроить запуск этой службы при загрузке системы. За подробными инструкциями по настройка автоматического запуска службы cron при загрузке системы обратитесь к главе 20 Управление доступом к службам.