Запуск процессов в указанное время - cron
| |
|
В OC UNIX периодическим выполнением процессов управляет демон cron. Он
запускается во время начальной загрузки системы и остается в активном
состоянии, пока система не выключена. Демон cron читает файл конфигурации,
который называется crontab-файлом, содержащий последовательность командных
строк и расписание их вызова. Командные строки обрабатываются
интерпретатором sh, поэтому почти все, что можно сделать из shell вручную,
можно перепоручить процессу cron.
Для просмотра и изменения конфигурации процесса cron необходимо использовать
команду crontab.
Для получения краткого описания использования команды, запустите ее без
параметров.
Команда 'crontab -l' выводит текущую конфигурацию cron на стандантный вывод.
Используя перенаправления ввода-вывода в shell, можно сохранить текущую
конфигурацию в файл. Например, после выполнения команды 'crontab -l >
mycrontab' файл mycrontab будет содержать текущую конфигурацю cron.
Для восстановления конфигурации cron из файла необходимо выполнить команду
'crontab mycrontab', где mycrontab - путь к файлу, содержащему конфигурацию.
Обратите внимание на то, что файл mycrontab в этом случае должен иметь
определенные права доступа - чтение и запись только для владельца. Изменить
права доступа к файлу на правильные можно при помощи команды chmod 600
mycrontab.
Чтобы полностью удалить конфигурацию cron, выполните команду 'crontab -r'.
Команда 'crontab -e' автоматически запустит текстовый редактор и
загрузит в него файл конфигурации cron. После выхода из редактора, новая
конфигурация cron будет установлена автоматически.
Конфигурационный файл содержит последовательность командных строк и
расписание их вызова. Пустые строки и строки, начинающиеся с символа
'#', игнорируются. Остальные строки являются установками переменных
окружения и командами cron.
Строки, устанавливающие переменные окружения, должны иметь вид 'NAME=VALUE',
где NAME - имя устанавливаемой переменной, VALUE - значение.
Эти переменные окружения будут установлены при выполнении команды в shell.
Строки, описывающие команды cron имеют формат:
минуты часы день_месяца месяц день_недели команда ....
Первые пять полей описывают расписание запуска команд. Начиная с
шестого поля и до конца строки следует команда. Допустимые значения
временных параметров:
| параметр | допустимый интервал |
| минуты | 0-59 |
| часы | 0-23 |
| день_месяца | 1-31 |
| месяц | 1-12 |
| день_недели | 0-7 (0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс) |
Символ '*' обозначает любое значение. Разрешено указывать диапазон
значений, например, '8-11' в поле 'часы', соответсвует 8,9,10 и
11 часам. Можно указывать список значений или диапазонов, перечисляя из
через запятую, например '2,5,9-17'. Также можно указать выполнение
команды через заданый интервал, используя символ '/'. Например, '12-18/2'
эквивалентно '12,14,16,18'. Если указать '*/15' в поле 'минуты',
команда будет выполняться каждые 15 минут.
День, в который будет выполняться команда, определяется двумя полями -
'день_месяца' и день_недели'. Команда будет выполняться в дни,
соответствующие хотя бы одному из указанных критериев. Например, расписание
'30 4 1,15 * *' предписывает cron выполнять команду в 04:30 в первый и
пятнадцатый день месяца.
Один раз в минуту процесс cron проверяет расписание вызова и выполняет те
команды, время запуска которых наступило (таким образом, минута - это
минимальный интервал, с которым cron может выполнять команды). Для
выполнения команды cron передает ее интерпретатору /bin/sh. Если в
конфигурационном файле установлены какие-либо переменные окружения, то они
будут установлены при выполнении команды. Как и в shell, в переменной HOME
автоматически сохраняется полный путь к домашней директории. При указании
путей рекомендуется использовать не полный путь к файлам, а эту переменную.
Например, для выполнения программы daily, которая находится в поддиректории
bin в домашней директории, ежедневно в 3:00, cron можно сконфигурировать
так:
0 3 * * * $HOME/bin/daily
Для ежедневного запуска программ рекомендуется использовать интервал времени
с 2 до 8 часов ночи, т.к. загрузка системы в этот период минимальна.
Аналогично, еженедельные запуски программ рекомендуется конфигурировать
на субботу или воскресенье.
Выполнение команды происходит с такими же ограничениями по объему
используемой памяти и процессорного времени, как и при выполнении в shell.
Данные выводимые командой на стандартный вывод (stdout) и стандартный вывод
сообщений об ошибках (stderr) отсылаются по email на адрес, установленный в
переменной окружения MAILTO. Если переменная не установлена MAILTO или
команда во время выполнения ничего не выводила, результаты работы по email
не посылаются. Установить значение переменной окружения можно при
конфигурировании cron.
Важно: при редактировании файла задач
необходимо завершать строки нажатием клавиши Enter. Только в этом случае
cron будет обрабатывать задания корректно.
Пример конфигурационного файла cron
# результаты выполнения команд отсылать на адрес cron@domain.ru
MAILTO=cron@domain.ru
# примеры расписаний выполнения команд
# весь вывод отсылать по email
# (если установлена переменная MAILTO)
# выполнять раз в полчаса
# в 0 и 30 минут каждого часа
*/30 * * * * $HOME/bin/every_half_hour
# выполнять четыре раза в час
# в 0,15,30 и 45 минут каждого часа
*/15 * * * * $HOME/bin/every_half_hour
# выполнять каждый час в 0 минут
0 * * * * $HOME/bin/hourly
# выполнять через час
# в 0,2,4,6,8,10,12,14,16,18,20 и 22 часов
0 */2 * * * $HOME/bin/every_other_hour
# выполнять ежедневно в 4:10
10 4 * * * $HOME/bin/daily
# выполнять еженедельно по воскресеньям в 5:20
20 5 * * 7 $HOME/bin/weekly
# выполнять ежемесячно 1 числа в 6:30
30 6 1 * * $HOME/bin/monthly
# Примеры перенаправления вывода при выполнении команд.
# (предполагаем, что переменная MAILTO установлена)
# выполнять команду каждую минуту,
# вывод дописывать в конец файла
* * * * * $HOME/bin/command >> $HOME/command.log 2>&1
# выполнять команду каждую минуту,
# стандартный вывод дописывать в конец файла,
# сообщения об ошибках отсылать по email
* * * * * $HOME/bin/command >> $HOME/command.log
# выполнять команду каждую минуту,
# вывод игнорировать полностью
* * * * * $HOME/bin/command > /dev/null 2>&1