 | Автоматизация периодически запускаемых заданий
Конфигурирование cron
Демон cron используется для периодического запуска комманд. Вы можете использовать cron для широкого круга задач по поддержке и администрированию. Если это событие или задание возникает с определенной реглярностью, его следует обслуживать при помощи cron. Cron пробуждается каждую минуту и проверяет, не нужно ли чего-нибудь сделать, но он не может запускать эти задания чаще чем раз в минуту. (Если вам требуется такая функциональность, возможно вам необходим демон, а не "cron job.") Cron журналирует свои действия через механизм syslog.
Cron ищет свои конфигурационные файлы, в которых устанавливаются переменные окружения и команды, которые следует исполнять, в разных местах. Первый из них -- это /etc/crontab, содержащий системные задания. Каталог /etc/cron.d/ может содержать различные конфигурационные файлы, дополняющие /etc/crontab. Отдельные пакеты могут добавлять файлы (с именами, соответсвующими имени паета) в /etc/cron.d/, но системному администратору следует использовать /etc/crontab.
ПОльзовательские конфигурации для cron хранятся в /var/spool/cron/crontabs/$USER. Однако, они должны быть созданы при помощи программы crontab. При помощи crontab пользователи могут задавать свои собственные периодически запускаемые задания.
Ежедневный, еженеделный и ежемесячный запуск заданий
Задания, которые должны выполняться ежедневно, еженедельно или ежемесячно -- а это наиболее распроcтраненная ситуация -- описываются согласно специальным соглашениям. Каталоги /etc/cron.daily/, /etc/cron.weekly/ и /etc/cron.monthly/ созданы для хранения наборов соответсвующих скриптов. Добавление или удаление скриптов в этих каталогах -- это простейший путь для управления системными заданиями. Например, система, которую обслуживаю я, осуществляет ежедневную ротацию файлов журналов при помощи скрипта:
Листинг 1. Пример скриптового файла, запускаемого ежедневно
$ cat /etc/cron.daily/logrotate
#!/bin/sh
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
|
Cron и anacron
Вы можете использовать anacron для выполнения команд с частотой в определенное количество дней. В отличие от cron, anacron проверяет каждое задание, которое должно было быть исполненено в течение последних n дней (где n -- это период, определенный для данного задания, в отличиие от проверки текущего времени для определения момента запуска). Если оно не запускалось, anacron производит запуск с задержкой, указанной в минутах в параметре delay. Таким образом, на машинах, которые не включены постоянно, переодически запускаемые задачи выполняются единожды, когда машина работает (конечно, точное время запуска может варьироваться, но задание не будет забыто).
Anacron читает список заданий из конфигурационного файла /etc/anacrontab. Каждая запись включает в себя период в днях, задержку в минутах, уникальный идентификатор задания и команду оболочки. Например, на одной из Linux систем, которую я поддерживаю, anacron используется для ежедневного, еженедельного и ежемесячного запуска заданий, даже если машина была выключена в тот момент, когда оно должно было быть запущено:
Листинг 2. Пример конфигурационного файла anacron
$ cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# These replace cron's entries
1 5 cron.daily nice run-parts --report /etc/cron.daily
7 10 cron.weekly nice run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly nice run-parts --report /etc/cron.monthly
|
Содержимое crontab
Формат /etc/crontab (или содержимое файлов /etc/cron.d/) несколько отличается от пользовательских файлов crontab. По сути дела, они содержат одно дополнительное поле, указывающее пользователя, под которым должна запускаться данная команда. Для пользовательских crontab файлов это не нужно, так как они уже содержат имя пользователя в своем названии (/var/spool/cron/crontabs/$USER).
Каждая строчка /etc/crontab или устанавливает переменную окружения, или описывает задание. Комментарии и пустые строки игнорируются. Для заданий cron первые пять полей задают время запуска (где каждое поле может задаваться списком или диапазоном). Поля обозначают минуты, часы, дни месяца, месяцы, дни недели (разделяются пробелами или табуляциями). Asterisk (*) в любой позиции обозначает любой. Например, для запуска задания в полночь по вторникам и четвергам с августа по октябрь, следует сделать так:
# line in /etc/crontab
0 0 * 7-9 2,5 root /usr/local/bin/the-task -opt1 -opt2
Использование специальных scheduling переменных
Наиболее распространенными scheduling pattern'ам назначены сокращенные имена, которые вы можете использовать в первых пяти полях:
- @reboot
- Запускать один раз, при старте.
- @yearly
- Запускать один раз в год, "0 0 1 1 *".
- @annually
- Тоже самое, что и @yearly.
- @monthly
- Запускать один раз в месяц, "0 0 1 * *".
- @weekly
- Запускать один раз в неделю, "0 0 * * 0".
- @daily
- Запускать один раз в день, "0 0 * * *".
- @midnight
- Тоже самое, что и @daily.
- @hourly
- Запускать раз в час, "0 * * * *".
Например, конфигурационный файл может содержать:
@hourly root /usr/local/bin/hourly-task
0,29 * * * * root /usr/local/bin/twice-hourly-task
Использование crontab
Для установки пользовательских заданий используйте команду crontab (в отличие от файла /etc/crontab). Конкретнее, crontab -e запускает текстовый редактор для правки файла. Вы можете вывести ваш текущий список заданий при помощи crontab -l и удалить задание при помощи crontab -r. Или же вы можете задать crontab -u user для управления заданиями указанного пользователя user, но по умолчанию это будете вы (ограничения на права доступа играют совю роль).
Если в системе пристутсвует файл /etc/cron.allow, то он должен содержать имена всех пользователей, которым разрешено управление такими заданиями. С другой стороны, если файла /etc/cron.allow нет, то пользователь не должен быть помещен в файл /etc/cron.deny, если ему должно быть разрешено управление заданиями. Если ни одного из этих файлов нет, кто угодно может использовать crontab.
|  |