Когда нам требуется запланировать выполнение задачи в 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 локально и изменять его по своему усмотрению:
$ mkdir -p ~/.local/etc && cp /etc/anacrontab ~/.local/etc
Вполне возможно, мы захотим изменить значение некоторых переменных, содержащихся в anacrontab, например,
MAILTO
. Теперь мы сможем определить расписание наших заданий внутри локальной таблицы anacrontab. В качестве последнего шага нам нужно убедиться, что anacron вызывается ежечасно. Для этого мы создадим запись в локальном crontab. Чтобы отредактировать наш локальный crontab, выполните следующую команду:$ crontab -e
Как только мы выполним приведённую выше команду, наш личный crontab откроется в нашем заданном по умолчанию текстовом редакторе. Чтобы запускать anacron в начале каждого часа, внутри него мы добавляем следующую строку:
0 * * * * /usr/sbin/anacron -s -t "${HOME}/.local/etc/anacrontab" -S "${HOME}/.local/var/spool/anacron"
В записи мы вызываем anacron с опцией -s, чтобы запланированные задания выполнялись последовательно, одно за другим. Чтобы указать файл, который мы хотим использовать в качестве таблицы anacrontab, мы используем опцию -t и передаём путь к файлу в виде аргумента. Наконец, с помощью опции -s мы указываем каталог, который должен использоваться для хранения временных меток заданий.
Выводы
В этом руководстве мы узнали, как использовать anacron для планирования заданий в системах, которые, в отличие от серверов, необязательно должны быть постоянно запущены. Мы кратко рассмотрели различия между anacron и cron, как установить anacron на некоторые из наиболее используемых дистрибутивов Linux, как работает anacron и как устроен anacrontab. Наконец, мы увидели, как реализовать непривилегированный экземпляр anacron для каждого пользователя.
Спасибо за внимание!
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
Voldemarius
Для разовых запланированных задач вполне достаточно at
webhamster
Например, в Astra Linux команда at работает только от root :)