Когда нам требуется запланировать выполнение задачи в Linux, мы всегда можем использовать такие утилиты, как cron или
systemd-timers. Есть различные реализации cron, но всех их объединяет то, что они запускаются как системные службы и рассчитаны на использование в постоянно работающих системах, например, на серверах. Когда нам нужно запланировать выполнение задачи на домашнем компьютере или ноутбуке, которые чаще всего находятся в выключенном состоянии, то можно просто использовать anacron.
Собственно, именно в этой статье, мы и узнаем, что такое anacron, чем отличается от cron, и как использовать anacron для планирования команд в Linux.
Содержание
Как установить anacron на некоторые из наиболее популярных дистрибутивов Linux.
Что такое anacron и каковы различия между anacron и cron.
Как устроен anacrontab.
Как запустить anacron от имени непривилегированного пользователя.
Требования к программному обеспечению и используемые условные обозначения
Категория
Требования, условные обозначения или используемая версия программного обеспечения
Система
Не зависит от дистрибутива
Софт
anacron, cron
Другое
Отсутствует
Обозначения
# — требует выполнения заданных linux-команд с привилегиями root, либо непосредственно от имени пользователя root или с помощью команды sudo
$ — подразумевает, что команды linux будут выполняться от имени обычного непривилегированного пользователя
Установка
Anacron (и cron) обычно устанавливаются по умолчанию во всех дистрибутивах Linux, однако если по той или иной причине вам необходимо установить их вручную, то вы можете использовать следующие команды:
В Fedora и других дистрибутивах, входящих в семейство RHEL, для установки пакетов «cronie» и «cronie-anacron» (cronie — это реализация cron, используемая в этих дистрибутивах) мы используем менеджер пакетов dnf:
$ sudo dnf install cronie cronie-anacron
В Debian и других дистрибутивах, основанных на debian, для выполнения той же операции мы используем следующую команду:
$ sudo apt install anacron cron
В Archlinux — cron и anacron не установлены по умолчанию, поскольку дистрибутив использует systemd-timers в качестве метода планирования задач по умолчанию. Однако установить пакеты можно, запустив менеджер пакетов Pacman и выполнив следующую команду:
$ sudo pacman -Sy cronie
Сравнение Anacron и Cron
Итак, каковы основные различия между anacron и cron? Прежде всего, cron работает как
демон: он запускается в фоновом режиме и предназначен для планирования заданий на постоянно работающих системах. С помощью cron мы можем точно настроить время выполнения заданий в пределах нескольких минут. С другой стороны, Anacron — это не демон, а команда, которую можно вызвать напрямую. Она, в свою очередь, полезна для планирования заданий на домашних системах, которые не всегда находятся в запущенном состоянии. С её помощью мы можем запланировать задания, которые должны выполняться максимум один раз в день.
Как работает anacron
Anacron работает следующим образом: при запуске он читает задания, запланированные в таблице
anacrontab, которая является для anacron тем же, чем crontab является для cron. Затем проверяет периодичность в днях для каждого задания и определяет, было ли оно выполнено за указанное количество дней: это делается путём хранения временных меток заданий в так называемом
spooldir, который по умолчанию находится в
/var/spool/anacron. Если задание не было запущено за указанное количество дней (например, машина была выключена), оно будет выполнено после определённого
интервала в минутах.
Как мы уже говорили, anacron не является демоном, поэтому его нужно вызывать как команду. В подавляющем большинстве случаев вызов anacron планируется через cron, ежечасно. На Fedora, например, anacron вызывается через скрипт
/etc/cron.hourly/0anacron.
Таблица anacrontab
Структура anacrontab отличается от классического crontab. По умолчанию таблица anacrontab, используемая cron, это обычно
/etc/anacrontab, но, как мы увидим далее в этой статье, при запуске anacron можно указать и другие. Anacrontab состоит из
четырёх колонок, в которых по порядку указываются:
Периодичность выполнения задания в днях.
Задержка, которую необходимо использовать для выполнения задания, в минутах.
Идентификатор задания.
Команда для выполнения.
В качестве примера — просто взгляните на содержимое стандартного anacrontab в последней версии Fedora:
# /etc/anacrontab: конфигурационный файл для anacron
# Подробнее см. в разделах anacron(8) и anacrontab(5).
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# максимальная случайная задержка, добавляемая к базовой задержке заданий
RANDOM_DELAY=45
# задания будут запускаться только в следующие часы
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
Как мы видим, помимо спецификаций заданий, anacrontab содержит также некоторые переменные окружения. Переменные
SHELL и
PATH не требуют пояснений: они определяют, какая оболочка должна использоваться в качестве интерпретатора и
PATH — путь к программе, соответственно.
Переменная
MAILTO используется для указания почтового адреса, на который должно быть отправлено письмо с выводом команд (по умолчанию письмо отправляется владельцу anacrontab, в данном случае root). Для того чтобы это стабильно работало, в системе должна быть настроена служба наподобие
sendmail. Чтобы отключить эту функцию, мы можем просто присвоить переменной пустое значение (например,
MAILTO="").
Переменная
RANDOM_DELAY определяет максимальное количество минут, которые случайным образом добавляются к задержке каждого задания; чтобы отключить эту функцию, мы можем просто установить значение 0. Наконец, переменная
START_HOURS_RANGE используется для определения часового интервала, которое будет использовано для запуска задания. Здесь мы должны выбрать диапазон часов, в течение которых мы точно будем уверены, что машина включена.
Давайте посмотрим, как специфицируются задания. В
первом столбце, как мы уже видели, указывается частота выполнения каждого задания в днях. Тут можно использовать целое число напрямую или же использовать макрос типа @daily, @weekly или @monthly (ежедневно, еженедельно или ежемесячно соответственно).
Второй столбец содержит задержку, которая будет использоваться для задания, указанную в минутах. Задержка применяется, когда вызывается anacron и решает, что команда должна быть выполнена.
Как планировать задания с помощью anacron от имени непривилегированных пользователей
Как мы уже отмечали ранее, команды, запланированные с помощью anacron, выполняются от имени root и определяются в системной таблице anacrontab, которая находится в каталоге
/etc/anacrontab. Временные метки заданий хранятся в каталоге
/var/spool/anacron. Чтобы иметь возможность использовать anacron в качестве непривилегированного юзверя, нам нужно создать эквивалент этих файлов для каждого пользователя. Наше расписание заданий будет сохранено в каталоге
~/.local/etc/anacrontab, а далее мы создадим и будем использовать каталог
~/.local/var/spool/anacron для хранения временных меток заданий, определённых в нём:
$ mkdir -p ~/.local/var/spool/anacron
В качестве сокращённого варианта можно скопировать системный anacrontab локально и изменять его по своему усмотрению:
Вполне возможно, мы захотим изменить значение некоторых переменных, содержащихся в anacrontab, например,
MAILTO. Теперь мы сможем определить расписание наших заданий внутри локальной таблицы anacrontab. В качестве последнего шага нам нужно убедиться, что anacron вызывается ежечасно. Для этого мы создадим запись в локальном crontab. Чтобы отредактировать наш локальный crontab, выполните следующую команду:
$ crontab -e
Как только мы выполним приведённую выше команду, наш личный crontab откроется в нашем заданном по умолчанию текстовом редакторе. Чтобы запускать anacron в начале каждого часа, внутри него мы добавляем следующую строку:
В записи мы вызываем anacron с опцией
-s, чтобы запланированные задания выполнялись последовательно, одно за другим. Чтобы указать файл, который мы хотим использовать в качестве таблицы anacrontab, мы используем опцию
-t и передаём путь к файлу в виде аргумента. Наконец, с помощью опции
-s мы указываем каталог, который должен использоваться для хранения временных меток заданий.
Выводы
В этом руководстве мы узнали, как использовать anacron для планирования заданий в системах, которые, в отличие от серверов, необязательно должны быть постоянно запущены. Мы кратко рассмотрели различия между anacron и cron, как установить anacron на некоторые из наиболее используемых дистрибутивов Linux, как работает anacron и как устроен anacrontab. Наконец, мы увидели, как реализовать непривилегированный экземпляр anacron для каждого пользователя.