понедельник, 14 января 2013 г.

Cron и Crontab

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

При загрузке операционной системы, запускается демон 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 и файлы должны иметь права доступа на "выполнение". Поэтому перед размещением файлов в одном из этих каталогов необходимо убедиться, что сценарии не насесут вред системе.

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

Как файлы для cron располагаются в директориях:

/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly

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

Пример.

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

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

#содержимое файла mail
#!/bin/bash
mess="test cron"
echo "$mess" |mutt -s "subj" -m application/octet-stream bob@server.ru

1.Создаем временный файл /home/user/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.

Комментариев нет:

Отправить комментарий