Когда нам требуется запланировать выполнение задачи в 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, однако если по той или иной причине вам необходимо установить их вручную, то вы можете использовать следующие команды:

  1. В Fedora и других дистрибутивах, входящих в семейство RHEL, для установки пакетов «cronie» и «cronie-anacron» (cronie — это реализация cron, используемая в этих дистрибутивах) мы используем менеджер пакетов dnf:

    $ sudo dnf install cronie cronie-anacron
  2. В Debian и других дистрибутивах, основанных на debian, для выполнения той же операции мы используем следующую команду:

    $ sudo apt install anacron cron
  3. В 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 состоит из четырёх колонок, в которых по порядку указываются:

  1. Периодичность выполнения задания в днях.
  2. Задержка, которую необходимо использовать для выполнения задания, в минутах.
  3. Идентификатор задания.
  4. Команда для выполнения.

В качестве примера — просто взгляните на содержимое стандартного 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.

Комментарии (2)


  1. Voldemarius
    24.08.2022 12:16
    +2

    Для разовых запланированных задач вполне достаточно at


    1. webhamster
      24.08.2022 14:01

      Например, в Astra Linux команда at работает только от root :)