CRON

## Планировщик заданий Cron

Cron — программа-­демон, предназначенная для выполнения заданий в определённое время или через определенные промежутки времени. Список заданий, которые будут выполняться автоматически в указанные моменты времени, содержится в файле /etc/crontab (и файлах /var/spool/cron). Посмотрим содержимое /etc/crontab:

root@vlamp:~# cat /etc/crontab

# that none of the other crontabs do.

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 \* \* \* \* root cd / && run-parts –report /etc/cron.hourly

25 6 \* \* \* root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )

47 6 \* \* 7 root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly )

52 6 1 \* \* root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )

Минуты могут принимать значение от 0 до 59, часы от 0 до 23, дни месяца от 1 до 31, месяц от 1 до 12, дни недели от 0 (воскресенье) до 6 (суббота). Дальше указываем пользователя (если делаем через утилиту crontab, это не нужно) и саму команду. Обратите внимание на SHELL и PATH. Не все будет работать так же, как в консоли или скрипте.

Кроме числовых значений, доступны и другие знаки. Например, \*, определяет все допустимые значения. Если все звездочки — это означает, что скрипт будет запускаться каждую минуту, каждый день.

Через запятую (',') можно указать несколько значений: 1,3,4,7,8.

Тире ('—') определяет диапазон значений, например: 1-­6, что эквивалентно 1,2,3,4,5,6.

Звездочка ('\*') определяет все допустимые значения поля. Например, звездочка в поле «Часы» будет эквивалентна значению «каждый час».

Слэш ('/') может использоваться для пропуска данного числа значений. Например, \*/3 в поле «Часы» эквивалентно строке 0,3,6,9,12,15,18,21; \* означает «каждый час», но /3 диктует использовать только первое, четвертое, седьмое и так далее, значение, определенное \*. Например, каждые полчаса можно задать как \*/30.

Минимальное время — одна минута. Cron каждую минуту просматривает список заданий и ищет те, которые нужно выполнить. Если требуется совершить действие с интервалом менее одной минуты, можно пойти на хитрость, использовать в команде sleep:

Дни недели и месяца в трехбуквенном варианте:

Дополнительные переменные cron

Теперь мы можем поставить скрипт бэкапирования в крон:

Отдельно стоит сказать о выводе команд.

По дефолту крон отправляет вывод скрипта на почту пользователю, который его запустил. Для любого локального пользователя можно настроить внешний ящик, куда будет отправляться предназначенная ему почта. Эти ящики можно вписать в конфиг /etc/aliases (после его редактирования нужно запустить команду newaliases, подробнее настройку рассмотрим на последнем занятии). Это поведение можно изменить, используя директиву MAILTO. Укажем имя пользователя, которому будет послано сообщение о выполнении задания:

Вместо имени также можно использовать электронный адрес:

Пример:

*# как обычно, с символа '#' начинаются комментарии

# выполнять каждый день в 0 часов 5 минут, результат складывать в log/daily

5 0 \* \* \* $HOME/bin/daily.job » $HOME/log/daily 2>&1

# каждый рабочий день в 22:00

0 22 \* \* 1-5 echo «Пора домой» | mail -s «Уже 22:00» john

23 \*/2 \* \* \* echo «Выполняется в 0:23, 2:23, 4:23 и т. д.»

5 4 \* \* sun echo «Выполняется в 4:05 в воскресенье»

0 0 1 1 \* echo «С новым годом!»

15 10,13 \* \* 1,4 echo «Эта надпись выводится в понедельник и четверг в 10:15 и 13:15»

0-59 \* \* \* \* echo «Выполняется ежеминутно»

0-59/2 \* \* \* \* echo «Выполняется по четным минутам»

1-59/2 \* \* \* \* echo «Выполняется по нечетным минутам»

# каждые 5 минут

\*/5 \* \* \* \* echo «Прошло пять минут»

# каждое первое воскресенье каждого месяца. -eq 7 — код дня недели, т.е. 1 → понедельник , 2 → вторник и т.д.0 1 1-7 \* \* [ «$(date '+\%u')» -eq 7 ] && echo «Эта надпись выводится каждое первое воскресенье каждого месяца в 1:00»*

**Утилита crontab**

Утилита позволяет править файл заданий, вызывая указанный по умолчанию редактор (vi, mcedit, nano. Как и visudo, правится не /etc/crontab, а пользовательские файлы в /var/spool/cron).

Добавление файла расписания:

Вывести содержимое текущего файла расписания:

Удаление текущего файла расписания:

Редактирование текущего файла расписания (при первом запуске будет выведен список поддерживаемых текстовых редакторов):

Этот ключ позволяет выполнять вышеописанные действия для конкретного пользователя: