Использование CRON и команды crontab

Автор: dinggo

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

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

При загрузке системы, запускается демон cron и проверяет очередь заданий at и заданий пользователей в файлах crontab. При запуске, демон cron сначала проверяет каталог /var/spool/cron на наличие файлов crontab, файлы crontab имеют имена пользователей, соответствующие именам пользователей из /etc/passwd Каждый пользователь может иметь только один файл crontab, записей в файле может быть несколько.

Другими словами - файлы crontab содержат инструкции для демона cron, который запустит задание(я) описаное в файле crontab. Все файлы crontab из каталога /var/spool/cron загружаются в память, одновременно с ними загружаются файлы из /etc/cron.d После этого демон cron загружает содержимое файла /etc/crontab При стандартных настройках, содержимое /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

Информация файла указывает, что:

содержимое каталога /etc/cron.hourly будет запускаться каждый час на первой минуте часа.

содержимое каталога /etc/cron.daily будет запускаться каждый день на второй минуте четвертого часа.

содержимое каталога /etc/cron.weekly будет запускаться каждое воскресенье на 22'ой минуте 4'го часа.

содержимое каталога /etc/cron.monthly будет запускаться каждый первый день месяца на 42'ой минуте 4'го часа.

SHELL=/bin/bash означает использовать для запуска команд /bin/bash , если переменная не указана, то значение будет взято из /etc/passwd для пользователя являющимся владельцем файла.

HOME=/ корневой каталог для пользователя (параметр не обязательный) При необходимости доступа к специальным свойствам интерпретатора, значения переменных SHELL и HOME можно изменить, не зависимо от того, что прописано в /etc/passwd

MAILTO=root означает кому отсылать сообщение о результате работы команд.

Все содержимое из этих каталогов будет запускаться с правами доступа пользователя root и файлы должны иметь права доступа на "выполнение" (про права доступа читай статью http://rst.void.ru/texts/chmod.txt) Поэтому перед размещением файлов в одном из этих каталогов необходимо убедиться, что сценарии не насесут вред системе.

После того, как демон cron запущен и прочел содержимое всех файлов crontab, он бездействует, просыпаясь каждую минуту и проверяя не требуется ли запуск какой-либо команды в данную минуту, или не появился ли новый файл crontab который необходимо обработать. Демон cron определяет изменения по времени модификации файлов или каталогов, такое его свойство избавляет от необходимости перезапуска демона.

Как отмечалось выше, размещение файлов для cron в каталогах

/etc/cron.hourly

/etc/cron.daily

/etc/cron.weekly

/etc/cron.monthly

доступно только пользователю root, для использования файлов crontab пользователями, нужно использовать команду crontab. Команда служит для создания, изменения и добавления файла для демона cron

Пример

Рассмотрим пример создания файла crontab для пользователя user ,домашняя директория /home/user

Задача: запускать каждую минуту файл /home/user/mail, который будет отправлять почту

#содержимое файла mail (файл должен быть с правами на запуск! например -rwxr-xr-x)

#!/bin/bash

mess="test cron"

echo "$mess" |mutt -s "subj" -m application/octet-stream bob@server.ru

1.Создаем временный файл /home/user/test содержимое файла test такое:

SHELL=/bin/bash

MAILTO=user

0-59 * * * * /home/user/mail

2. Запускаем в терминале команду crontab /home/user/test

Все. После этого в каталоге /var/spool/cron будет создан файл "user" примерно с таким содержимым

# DO NOT EDIT THIS FILE - edit the master and reinstall.

# (/home/user/test installed on Mon Mar 29 02:31:34 2004)

# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)

SHELL=/bin/bash

MAILTO=user

0-59 * * * * /home/user/mail

и файл /home/user/mail будет запускаться демоном cron каждую минуту.

Доступ в каталог /var/spool/cron непривилегированому пользователю закрыт, что бы посмотреть юзером "user" есть ли у него файл crontab ,достаточно набрать команду crontab -l , если файл существует-будет показано его содержимое.

Для удаления файла используется команда crontab -r

Для редактирования crontab -e

Для управления файлами crontab пользователем "root" используется синтаксис:

-------------------------

crontab -u user_name file -создание файла crontab

------------------------- из файла "file" для

юзера "user_name"

-u означает чей crontab будет обработан, Если опция не задана, то будет обработан crontab того пользователя, который запустил команду crontab.

-------------------------

crontab -u user_name -l -просмотр файла crontab

------------------------- юзера "user_name"

-------------------------

crontab -u user_name -r -удаление файла crontab

------------------------- юзера "user_name"

-------------------------

crontab -u user_name -e -редактирование файла crontab

------------------------- юзера "user_name" используя

редактор, заданный переменной

окружения VISUAL или EDITOR

Формат и значения полей

Каждая команда в пользовательском файле crontab занимает одну строку и состоит из шести полей. Пользовательские файлы crontab находятся в каталоге /var/spool/cron

Общий формат команды:

------------------------------------------------

минута час день_месяца месяц день_недели команда

------------------------------------------------

Допустимые значения:

минута от 0 до 59

час от 0 до 23

день_месяца от 1 до 31

месяц от 1 до 12 (можно три буквы из названия месяца,

регистр не имеет значения от jan до dec)

день_недели от 0 до 6 (0 это воскресенье,

можно писать от sun до sat)

Каждое из полей даты и времени может быть обозначено символом * ,будет соответствовать любому возможному значению. Для этих полей можно указывать диапазоны значений, разделенных дефисом, например:

* 5 4-10 0-3 * echo "HELLO" -печать HELLO в 5:00 на 4,5,6,7,8,9,10

дни января, февраля, марта и апреля

пошаговая запись

* */2 * * sat echo "HELLO" -печать HELLO каждый четный час,

каждую субботу

равнозначная предыдущему примеру запись (списком)

* 0,2,4,6,8,10,12,14,16,18,20,22 * * sat echo "HELLO"

-печать HELLO каждый четный

час, каждую субботу

то же самое с указанием диапазона

* 0-23/2 * * sat echo "HELLO" -печать HELLO каждый четный

час, каждую субботу

59 23 31 dec * echo "Happy new year" -без комментариев :),

поздравит с новым годом

Для отладки задания cron, можно перенаправить результат в файл

Пример:

0-59 * * * * /home/user/mail 2>/tmp/tmp.cron

Если при запуске команды /home/user/mail возникнут ошибки, то они будут записаны в файл /tmp/tmp.cron и вы всегда сможете узнать причину. В случае перенаправления вывода в файл, письмо, юзеру указаному в переменной MAILTO отправлено не будет.

Посмотреть информацию о всех командах запускаемых демоном cron можно в каталоге /var/log называются cron, cron1 и т.д.

В файле /var/log/cron записано время запуска всех заданий cron за предыдущий день

Mar 29 04:03:00 rst CROND[4434]: (user) CMD (/home/user/mail)

Mar 29 04:03:59 rst CROND[4493]: (user) CMD (/home/user/mail)

Mar 29 04:05:00 rst CROND[4507]: (user) CMD (/home/user/mail)

Mar 29 04:06:00 rst CROND[4549]: (user) CMD (/home/user/mail)

В остальных файлах cron1,cron2 находится подобная информация, но более старая чем в cron

Вот практически и все, что требуется знать для использования cron и crontab.

Cron

Cron - средство запуска программ по расписанию В операционной системе UNIX и ей подобных для запуска программ по расписанию используется механизм, называемый cron. Пользователь, желающий запускать свои программы по расписанию, создает конфигурационный файл, куда записывает расписание запуска программ. Данный конфигурационный файл каждую минуту просматривается cron'ом и запускаются те программы, время запуска которых подошло. Редактируется конфигурационный файл с помощью программы crontab. Программы, запускаемые cron, исполняются от имени пользователя - владельца соответствующего конфигурационного файла. Как создать и отредактировать свой конфигурационный файл? Редактировать конфигурационный файл можно двумя способами. Способ первый - прямое редактирование через crontab.

Наберите в командной строке команду crontab -e. Откроется редактор vi с содержимым вашего конфигурационного файла. Если это первый запуск crontab'а, то файл будет пустой.

Отредактируйте содержимое.

Выйдите из редактора. Crontab автоматически даст команду демону cron перечитать Ваш файл.

У этого способа есть один недостаток - редактор vi, в котором открывается файл, довольно сложен в использовании и требует определенного опыта и навыков. Способ второй - приказ демону cron перечитать готовый файл. Этот способ проще в использовании.

Создайте конфигурационный файл на сервере командой touch имя_файла.

Отредактируйте его в привычном для Вас редакторе, например в FAR'е.

Если Вам не нравится редактировать файл на сервере, то Вы можете создать и отредактировать файл на своем компьютере и затем закачать его на сервер по FTP.

Выполните команду crontab имя_файла. Crontab при этом даст команду демону cron перечитать Ваш файл.

Имейте в виду, для того, чтобы любое изменение конфигурационного файла вступило в силу, необходимо снова выполнить команду crontab имя_файла. При этом все предыдущие настройки crontab будут перезаписаны новыми. Кроме того, не следует путать конфигурационный файл crontab с тем файлом, который создаете Вы сами. Команда crontab имя_файла копирует содержимое Вашего файла в специальный файл crontab, после этого Ваш файл в процессе больше не участвует. Что нужно писать в конфигурационном файле? Конфигурационный файл состоит из строк, каждая из которых описывает программу, которая будет запускаться по расписанию. Каждая строка состоит из 6 полей, поля отделяются друг от друга пробелом или табуляцией. Поля имеют следующее назначение:

Минуты (0-59)

Часы (0-23)

День месяца (1-31)

Месяц в году (1-12)

День недели (0-6, при этом 0 означает воскресенье)

Программа, которая будет запущена

Каждое из первых 5 полей может быть записано несколькими способами:

Символом * (означает любое значение)

Списком через запятую (1,2,3)

Диапазоном через тире (1-31)

Шагом значений диапазона (например */2 означает через_раз)

Кроме того, Вы можете получать по почте результаты и ошибки выполнения программ, запускаемых демоном cron по расписанию. Для этого в конфигурационном файле напишите MAILTO=ваш_email_адрес. Где я могу получить дополнительную информацию? Для получения дополнительной информации по этой теме можно воспользоваться встроенной справочной системой, набрав в командной строке сервера: man cron - описание особенностей функционирования cron man 1 crontab - описание способов использования crontab man 5 crontab - описание формата конфигурационных файлов для cron Как запускать php скрипт из cron'a? Строка в кронфайле, запускающая php скрипт выглядит так: * * * * * /usr/local/bin/php /home/user/www/site1/public_html/script.php где /usr/local/bin/php - путь до php-интерпретатора (на различных серверах путь может быть разным. Выяснить путь можно с помощью команды which php); /home/user/www/site1/public_html/script.php - путь до скрипта необходимо указывать от корня сервера. Мой php скрипт требует параметров в адресной строке, как можно вызвать такой скрипт? Для запуска php-скриптов методом GET из cron`a используют утилиту wget. Строка записи cron-файла выглядит так: * * * * * /usr/local/bin/wget 'http://имя_домена/script.php?var1=xxx&var2=yyy' Где /usr/local/bin/wget - путь до утилиты wget; http://имя_домена/script.php?var1=xxx&var2=yyy - ссылка на скрипт. В случае, если Вы не хотите, чтобы полученный от скрипта вывод сохранялся в файле, можно использовать вместо wget программу GET. Как запустить perl скрипт из cron'a? Для запуска perl-скриптов указывать путь до интерпретатора не нужно, так как путь уже указан в заголовке самого скрипта.

Запуск процессов в указанное время - 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

crontab - обслуживает crontab файлы для отдельных пользователей (V3)

 

СИНТАКСИС

crontab [ -u пользователь ] файл

crontab [ -u пользователь ] { -l | -r | -e }

 

ОПИСАНИЕ

crontab это программа, используемая для установки, деустановки или получения списка таблиц, которые использует для управления демон cron(8)  в Vixie Cron. Каждый пользователь может иметь свои собственные файлы crontab в /var, они не предназначены для прямого редактирования.

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

Если задана опция -u то она задает имя пользователя чей crontab будет обработан. Если опция не задана, то будет обработан ваш crontab т.е. той персоны, которая запустила команду. Заметим, что su(8)  может оконфузить crontab и что если вы напротив, запускаете su(8)  то вы должны всегда использовать опцию -u безопастности ради.

Первая форма этой команды используется для устновки новой crontab из какого-нибудь файла или стандартного ввода если задано псевдо-имя ``-''.

Опция -l выводит текущих crontab файл на стандартный вывод.

Опция -r удаляет текущий crontab файл.

Опция -e используется для редактирования текущего crontab используя редактор, заданный переменной окружения VISUAL или EDITOR. После вашего выхода из редактора, отредактированный crontab будет установлен автоматически.

 

СМ. ТАКЖЕ

crontab(5) , cron(8)

 

ФАЙЛЫ

/var/spool/cron/allow

/var/spool/cron/deny

 

СТАНДАРТЫ

Команда crontab совместима со стандартом IEEE Std1003.2-1992 (``POSIX''). Новый синтаксис команды отличается от предыдущей версии Vixie Cron, также как от классического SVR3 синтаксиса.

 

СООБЩЕНИЯ ОБ ОШИБКАХ

Довольно информативная подсказка появляется, если вы запуститесь с неправильной командной строкой.

Соседние файлы в папке материалы к собеседованию