Хорошая статья. Почти разжевано, кроме одного момента - вот эти два параметра (START_HOURS_RANGE= и RANDOM_DELAY=) как прописывается? отдельной строкой или в строке задания после какого-то параметра ?
Укрощение anacron
Добрый день.
Сегодня поделюсь своими знаниями в области выполнения заданий по расписанию в linux.
За выполнение заданий по расписанию отвечает утилита cron. Наверняка многоие о ней слышали. Она достаточно проста в настройке и использовании, поэтому я не буду ее подробно описывать, к тому же, в сети существует множество мануалов по работе с этой программой. Суть в чем: вы задаете в настройках что необходимо выполнять (программу, скрипт или просто команду), указываете интервал выполнения: каждую минуту/час/день например в 9:15 утра и все - ваше задание будет выполняться в указанное время. Но есть один нюанс: если в назначенное время выполнения задания ваш компьютер будет выключен, то это задание благополучно НЕ выполнится. Поэтому, если хотите пользоваться cron`ом, то держите компьютер постоянно включенным.
Конечно совет выше скорее шуточный (если у вас не сервер), есть еще одно решение этой проблемы - anacron. Как видно из названия, это асинхронный крон. Он выполняет задания не в определенное вами время, а через заданный промежуток времени и в случае, если компьютер будет выключен в нужное время, anacron выполнит это задание при следующей загрузке системы. Это то что нам нужно!
Все бы хорошо, но по anacron`у (в отличие от cron) толковой информации в сети кот наплакал, да и то она вся на английском языке. Поэтому мне пришлось, что называется, методом научного тыка осваивать эту программу.
Теперь подробнее о использовании anacron. Все задания вносятся в файл /etc/anacrontab. Редактировать этот файл можно любым используемым вами текстовым редактором, только необходимы права root-пользователя. Так как anacron может выполнять задания только от рута. В связи с этим, все задания необходимо откорректировать с учетом этой особенности. Например если в задании вы используете указание пути вида:
то нужно заменить его такой строкой:
Формат файла такой: период в днях | задержка в минутах | уникальное имя для задания | выполняемая команда. Как видите набор параметров невелик. Но этого вполне достаточно. Рассмотрим например такую строку:
@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 есть еще две опции, на которые стоит обратить внимание:
вот:
указывает в какой промежуток времени будут выполняться задания в день Х. Если нужно чтобы они выполнялись не сразу после загрузки компьютера (если конечно эта загрузка была утром), а в период с 16:00 по 22:00, то цифру 3 нужно заменить на 16;
и вот:
устанавливает случайное время задержки в минутах от 0 до 45 перед выполнением задания. Да, я помню, что время задержки мы уже указывали. Этот параметр суммируется с указанным нами временем и после этого задание выполняется. Честно говоря, не совсем понимаю мотивы разработчиков с применением этой опции, но им виднее...
Вот, собственно и вся нехитрая настройка anacron.
Теперь еще о хитростях: в папке /etc есть папки cron.daily, cron.weekly и cron.monthly. Так вот, если необходимо чтобы задания выполняись ежедневно/еженедельно/ежемесячно, то достаточно скопировать свой скрипт, который нужно выполнять в соответствующую папку или даже ссылку на скрипт и все, никаких правок anacrontab. Задание будет выполняться! Единственное НО: название вашего скрипта должно быть на латинице.
Но чтобы anacron работал его в первую очередь нужно установить. Есть несколько программ, включающих в себя функциональность anacron: cronie, dcron, fcron и собственно anacron. В Archlinux используется cronie. Она входит в группу base, поэтому устанавливается по умолчанию. Для запуска cronie можно использовать такие команды:
sudo systemctl enable cronie
На этом собственно и хотелось бы закончить. Пользуйтесь anacron, пусть компьютер сам делает рутинную, однообразную работу.
Ну и конечно комментарии приветствуются.