Запуск процессов по расписанию в указанное время - 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.
Все сообщения об ошибках как от самого cron'а, так и от выполняемых через cron
команд и скриптов (стандартный вывод - STDOUT - и стандартный вывод сообщений
об ошибках - STDERR) можно получать на e-mail, установив в конфигурации cron
переменную окружения MAILTO.
Это можно сделать с помощью crontab, указав в начале такую строчку:
MAILTO=mail@host.ru
где mail@host.ru - Ваш e-mail.
Если переменная MAILTO не установлена или
команда во время выполнения ничего не выводила, результаты работы по e-mail
не посылаются.
Важно: при редактировании файла задач
необходимо завершать строки нажатием клавиши 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