< Systemd (Русский)

systemd (Русский)/Timers (Русский)

Таймеры — файлы юнитов systemd, имя которых имеет суффикс .timer; они позволяют контролировать файлы .service или события. Таймеры могут использоваться в качестве замены cron (смотрите #В качестве замены cron). Таймеры имеют встроенную поддержку календарных и регулярных событий и могут запускаться в асинхронном режиме.

Состояние перевода: На этой странице представлен перевод статьи systemd/Timers. Дата последней синхронизации: 12 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Юниты таймера

Таймеры systemd — файлы юнитов с суффиксом .timer. Они хранятся в тех же каталогах, что и другие файлы настроек юнитов, но включают в себя раздел [Timer], который определяет, как и когда таймер запускается. Существует два типа таймеров:

  • Таймеры реального времени (также известные как настенные часы) запускаются в зависимости от событий календаря (как cronjobs). Для определения таких таймеров используется опция OnCalendar=.
  • Монотонные таймеры активируются после определенного промежутка времени по отношению к той или иной отправной точке. Они не сработают, если компьютер находится в режиме ожидания или выключен. Есть несколько различных монотонных таймеров, но все они имеют вид: OnTypeSec=. Обычно монотонные таймеры включают в себя и .

Подробнее см. systemd.timer(5). Синтаксис аргументов для календарных событий и временных промежутков можно найти в .

Примечание: В systemd предусмотрена цель timers.target, к которой можно привязать таймеры, запускаемые сразу после загрузки системы (подробнее см. systemd.special(7)). Чтобы ею воспользоваться, укажите параметр WantedBy=timers.target в разделе [Install] файла таймера, после чего включите юнит.

Юнит службы

Каждому файлу .timer соответствует файл .service (например, и ). .timer запускается и контролирует .service. .service не требует раздела , так как последний присутствует в юните timer, который уже включен. Если необходимо, то можно контролировать юниты с разным названием, используя опцию в таймере в разделе [Timer].

Управление

Для того, чтобы использовать юнит-timer, включите и запустите его, как любой другой юнит (не забудьте добавить суффикс .timer). Для того, чтобы увидеть все запущенные таймеры, выполните:

Примеры

Запуск службы может быть запланирован по таймеру. В последующих примерах назначается запуск в соответствии с таймером .

Монотонный таймер

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

Таймер реального времени

Таймер, который будет запускаться один раз в неделю (в 12:00 в понедельник). При активации он сразу же запустит службу, если отсутствует последнее время запуска (опция ), например, в связи с отключением системы:

/etc/systemd/system/foo.timer
[Unit]
Description=Run foo weekly

[Timer]
OnCalendar=weekly
Persistent=true     
 
[Install]
WantedBy=timers.target

Если требуется указать более точную дату и время, используйте следующий формат:

ДеньНедели Год-Месяц-День Часы:Минуты:Секунды

Звездочка может быть использована, чтобы указать все значения, а запятые, в свою очередь, для перечисления возможных значений. Используйте .., чтобы выделить какой-то конкретный промежуток. В следующем примере служба запускается в первые четыре дня каждого месяца в полдень, но только если день является понедельником или вторником.

OnCalendar=Mon,Tue *-*-01..04 12:00:00

Запуск службы в первую субботу каждого месяца:

OnCalendar=Sat *-*-1..7 18:00:00

По крайней мере один день должен быть указан при использовании . Таймер, который будет запускаться каждый день в 4 утра:

OnCalendar=*-*-* 4:00:00

Если необходимо запускать службу в разное время, то можно указать параметр несколько раз. В примере ниже служба запускается в 22:30 по рабочим дням и в 20:00 по выходным:

OnCalendar=Mon..Fri 22:30
OnCalendar=Sat,Sun 20:00

Подробнее см. .

Временные юниты .timer

Можно использовать для создания временных юнитов .timer. То есть можно назначить запуск определённой команды в нужное время, не имея соответствующего файла службы. Например, следующая команда создаст файл через 30 секунд:

# systemd-run --on-active=30 /bin/touch /tmp/foo

Кроме того, можно указать предварительно существующий файл сервиса, при этом не имея файла таймера. Например, запустим юнит, который называется , через 12.5 часов:

# systemd-run --on-active="12h 30m" --unit некоторыйюнит.service

Смотрите для получения дополнительной информации и примеров.

В качестве замены cron

Несмотря на то, что cron, возможно, самый известный планировщик задач, таймеры systemd могут выступать в качестве альтернативы.

Преимущества

Основные преимущества использования таймеров приходят от каждой задачи, которая имеет собственную службу systemd. Вот некоторые из этих преимуществ:

  • Задачи могут быть легко запущены независимо от их таймеров. Это упрощает отладку.
  • Каждая задача может быть настроена для работы в определенной среде (смотрите ).
  • Задачи могут быть присоединены к cgroups.
  • Задачи могут быть настроены в зависимости от других юнитов systemd.
  • Задачи регистрируются в журнале systemd для легкости отладки.

Предостережения

Некоторые вещи, которые легко сделать посредством cron, трудно сделать только юнитами таймера.

  • Создание: чтобы настроить задачу, запускаемую в определенное время, при помощи systemd, вам нужно создать два файла и использовать команды . Сравните это с добавлением одной строчки в crontab.
  • Электронная почта: отсутствие встроенного эквивалента cron MAILTO для отправки писем при сбое. В следующем разделе приведен пример создания эквивалента с использованием .

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

MAILTO

Вы можете настроить systemd для отправки электронной почты при сбое юнита - так же, как Cron делает с MAILTO. Прежде всего, нужно два файла: исполняемый для посылки почты и .service для запуска первого. В следующем примере, исполняемый файл - скрипт, использующий , который можно найти в пакетах, предоставляющих smtp-forwarder.:

Исполняемый файл, видимо, должен получать минимум два аргумента, полученных сценарием: адрес для отправки и файл юнита для получения статуса. Файл .service, который мы создадим, будет передавать эти аргументы:

Здесь — получатель почты, а — адрес электронной почты пользователя. Хотя получать "захардкожен", файл юнита для отчёта передается как параметр экзепляра, поэтому данная служба может посылать электронные письма множеству юнитов. Запустите , чтобы убедиться, что вы можете получать почту.

Затем просто отредактируйте службу, от которой вы хотите получать почту и добавьте в раздел [Unit]. передает имя юнита в шаблон.

Использование crontab

Некоторые из предостережений можно обойти путем установки пакета, который анализирует crontab, а затем настраивает таймеры на его основе. и systemd-cronAUR — два таких пакета. Они могут предоставлять недостающую функцию MAILTO.

Если вам нравится crontabs только потому, что он предоставляет единый вид для всех запланированных задач, делает тоже самое. Смотрите #Управление

Смотрите также

gollark: It's also sideways.
gollark: I have no idea what that means.
gollark: It ate a wind turbine here.
gollark: There is much more flux than usual, so we are experiencing bad things.
gollark: Basically, flux is abstract magic bad things.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.