Linux32 - Блог



LINUX32

Свобода выбирать


ArchLinux
Блог >> 2014 >> Март


31.03.2014

Укрощение anacron




Добрый день.

Сегодня поделюсь своими знаниями в области выполнения заданий по расписанию в linux.

За выполнение заданий по расписанию отвечает утилита cron. Наверняка многоие о ней слышали. Она достаточно проста в настройке и использовании, поэтому я не буду ее подробно описывать, к тому же, в сети существует множество мануалов по работе с этой программой. Суть в чем: вы задаете в настройках что необходимо выполнять (программу, скрипт или просто команду), указываете интервал выполнения: каждую минуту/час/день например в 9:15 утра и все - ваше задание будет выполняться в указанное время. Но есть один нюанс: если в назначенное время выполнения задания ваш компьютер будет выключен, то это задание благополучно НЕ выполнится. Поэтому, если хотите пользоваться cron`ом, то держите компьютер постоянно включенным.

Конечно совет выше скорее шуточный (если у вас не сервер), есть еще одно решение этой проблемы - anacron. Как видно из названия, это асинхронный крон. Он выполняет задания не в определенное вами время, а через заданный промежуток времени и в случае, если компьютер будет выключен в нужное время, anacron выполнит это задание при следующей загрузке системы. Это то что нам нужно!

Все бы хорошо, но по anacron`у (в отличие от cron) толковой информации в сети кот наплакал, да и то она вся на английском языке. Поэтому мне пришлось, что называется, методом научного тыка осваивать эту программу.

Теперь подробнее о использовании anacron. Все задания вносятся в файл /etc/anacrontab. Редактировать этот файл можно любым используемым вами текстовым редактором, только необходимы права root-пользователя. Так как anacron может выполнять задания только от рута. В связи с этим, все задания необходимо откорректировать с учетом этой особенности. Например если в задании вы используете указание пути вида:

%HOME/путь/до/файла


то нужно заменить его такой строкой:

/home/username/путь/до/файла


Формат файла такой: период в днях | задержка в минутах | уникальное имя для задания | выполняемая команда. Как видите набор параметров невелик. Но этого вполне достаточно. Рассмотрим например такую строку:

@daily 5 test echo "Привет"


• @daily означает что слово "Привет" будет выводиться каждый день. Кстати сказать, минимальный период в анакрон равен одному дню. Вместо @daily можно использовать @weekly, @monthly или соответствующее им цифровое обозначение периода в днях: 1/7/30 или любое другое число.

• 5 означает задержку в минутах перед выполнением задания. Обычно ее используют чтобы дать компьютеру полностью загрузиться. Так как все задания выполняются по очереди при первой загрузке компьютера в назначенный день.

• test - это имя задания. В папке /var/spool/anacron хранятся файлы с именами заданий, внесенных в файл anacrontab. В каждом таком файле дата последнего выполнения задания в формате YYYYmmdd. В этих файлах весь секрет: основываясь на дате последнего выполнения, анакрон отсчитывает от нее нужный период и снова выполняет задание, записывая новую дату в этот файл. Есть небольшая хитрость. Например нужно чтобы какое-либо задание выполнялось каждый вторник, а вносим мы это задание в anacrontab в четверг. Так как анакрон не дает возможности выбрать конкретный день выполнения задания, а только интервал, то следуя логике наше задание будет выполняться по четвергам, что нам не нужно. Для исправления такого поведения можно вручную, от рута, создать файл test (то есть с именем задания из anacrontab) в папке /var/spool/anacron с датой последнего вторника в формате, который я приводил выше и анакрон будет думать что в прошлый вторник он уже выполнял это задание, поэтому следующий раз выполнит его в следующий вторник. Но один нехороший момент все же остается: если компьютер в какой-нибудь из вторников не будет ни разу загружен, а включат его например в среду, тогда выполнение задания test сместится на один день и будет происходить по средам. Для исправления нужно опять же отредактировать файл test и выставить в нем нужную дату.

• echo "Привет" - собственно команда для выполнения. Здесь может быть команда, путь к установленной программе или скрипту (скрипт должен быть исполняемым).

Для максимальной настраиваемости в файле /etc/anacrontab есть еще две опции, на которые стоит обратить внимание:

• вот:

START_HOURS_RANGE=3-22


указывает в какой промежуток времени будут выполняться задания в день Х. Если нужно чтобы они выполнялись не сразу после загрузки компьютера (если конечно эта загрузка была утром), а в период с 16:00 по 22:00, то цифру 3 нужно заменить на 16;

• и вот:

RANDOM_DELAY=45


устанавливает случайное время задержки в минутах от 0 до 45 перед выполнением задания. Да, я помню, что время задержки мы уже указывали. Этот параметр суммируется с указанным нами временем и после этого задание выполняется. Честно говоря, не совсем понимаю мотивы разработчиков с применением этой опции, но им виднее...

Вот, собственно и вся нехитрая настройка anacron.

Теперь еще о хитростях: в папке /etc есть папки cron.daily, cron.weekly и cron.monthly. Так вот, если необходимо чтобы задания выполняись ежедневно/еженедельно/ежемесячно, то достаточно скопировать свой скрипт, который нужно выполнять в соответствующую папку или даже ссылку на скрипт и все, никаких правок anacrontab. Задание будет выполняться! Единственное НО: название вашего скрипта должно быть на латинице.

Но чтобы anacron работал его в первую очередь нужно установить. Есть несколько программ, включающих в себя функциональность anacron: cronie, dcron, fcron и собственно anacron. В Archlinux используется cronie. Она входит в группу base, поэтому устанавливается по умолчанию. Для запуска cronie можно использовать такие команды:

sudo systemctl start cronie
sudo systemctl enable cronie


На этом собственно и хотелось бы закончить. Пользуйтесь anacron, пусть компьютер сам делает рутинную, однообразную работу.

Ну и конечно комментарии приветствуются.

Статья


Ваш комментарий:

Имя:
E-mail:
Код с картинки:
Комментарий:




Федор, 21 Июня 2014 года в 02:38, писал(а):



Хорошая статья. Почти разжевано, кроме одного момента - вот эти два параметра (START_HOURS_RANGE= и RANDOM_DELAY=) как прописывается? отдельной строкой или в строке задания после какого-то параметра ?
Admin, 21 Июня 2014 года в 08:20, писал(а):



Федор, спасибо за отзыв. Эти два параметра присутствуют по умолчанию в файле /etc/anacrontab каждый в отдельной строке. Необходимо всего лишь вписать нужные значения после знака равно и раскомментировать строку.
Федор, 23 Июня 2014 года в 15:26, писал(а):



Спасибо, понятно про их расположение. По умолчанию их нет. ОС - Рунту 12.04 (усеченная Xubuntu)