Системный менеджер systemd

Для управления сервисами в Системе используется системный и сервисный менеджер systemd. systemd отвечает за управление процессами, службами и различными системными компонентами.

К основным задачам systemd относятся:

  • Инициализация системы при запуске. systemd запускает все необходимые службы и процессы во время старта системы;
  • Управление всеми системными службами;
  • Мониторинг состояния системы: сбор и предоставление информации о текущем состоянии всех служб и ресурсов системы;
  • Управление зависимостями между службами, что гарантирует корректный порядок их запуска.

Управление службами

Команда systemctl является основным инструментом для взаимодействия с systemd. Она используется для запуска, остановки, перезагрузки и мониторинга служб.

Рассмотрим основные команды по управлению сервисами в ОС.

Запуск сервиса:

systemctl start <имя_сервиса>

Остановка сервиса:

systemctl stop <имя_сервиса>

Перезапуск сервиса:

systemctl restart <имя_сервиса>

Проверка статуса сервиса:

systemctl status <имя_сервиса>

Включение автозапуска сервиса при старте системы:

systemctl enable <имя_сервиса>

Отключение автозапуска сервиса при старте системы:

systemctl disable <имя_сервиса>

Перезагрузка с целью применения изменений конфигурации без перезапуска служб:

systemctl reload <service_name>

Управление группами служб, например, можно запускать или останавливать группу служб:

systemctl start <group_name>
systemctl stop <group_name>

Фильтрация вывода systemctl возможна по различным критериям, таким как состояние службы с использованием опции --state или тип с использованием опции –type.

Unit-файлы

Unit-файлы являются основными конфигурационными файлами, которые используются в systemd для управления службами, монтированием файловых систем, сокетами и другими системными объектами. Именно они определяют, как и когда должны запускаться процессы, как обрабатывать их зависимости, и другие аспекты работы службы или ресурса.

Существуют различные типы unit-файлов:

  • service (расширение .service) – определяет параметры для управления службами;
  • target (расширение .target) – группирует несколько unit-файлов и управляет их совместным запуском;
  • socket (расширение .socket) – управляет сокетами, которые используются для активации служб;
  • mount (расширение .mount) – управляет точками монтирования файловых систем;
  • timer (расширение .timer) – предназначены для создания и управления таймерами, выполняют роль планировщика задач.

Unit-файлы имеют следующую базовую структуру:

  • [Unit] – описание метаданных и зависимостей;
  • [Service]/ [Timer] (или другой секции в зависимости от типа unit-файла) – определяет параметры запуска и управления процессом;
  • [Install] – настройки, связанные с автозапуском и включением unit-файла в зависимости от системных целей (targets).

Настройки параметров unit-файлов помогают детально управлять поведением и запуском различных системных служб и компонентов. Рассмотрим написание и настройки unit-файлов в systemd:

  1. Секция [Unit] задает общие сведения о юните и его зависимости:
  • Description= – краткое описание юнита;
  • Wants= – указывает на необязательную зависимость: основной юнит пытается запустить другой юнит, указанный в параметре. Ошибки при запуске зависимого юнита не мешают запуску основного. Если параметры After= и Before= не указаны, юниты запускаются параллельно;
  • Requires= – обозначает обязательную зависимость: основной юнит требует запуск другого юнита. Если запуск зависимого юнита неудачен, основной юнит также не запустится. Без параметров After= и Before= оба юнита будут запущены одновременно;
  • After= – указывает, что основной юнит должен запускаться только после другого, указанного в параметре. Этот параметр часто используется вместе с Wants= и Requires=;
  • Before= – противоположен After=, определяет запуск основного юнита перед другим юнитом.
  1. Секция [Install] используется для настройки автозапуска юнита:
  • Alias= – позволяет задать дополнительные имена для юнита, при этом создаются символические ссылки на основной юнит. Поддерживается не всеми типами юнитов;
  • WantedBy= – указывает на цель, с которой связан данный юнит; при активации юнита команда systemctl enable создаст символическую ссылку в соответствующем каталоге;
  • Also= – перечисляет другие юниты, которые также будут добавлены в автозапуск или удалены из него при изменении состояния текущего юнита.
  1. Секция [Service] задает параметры управления службами:
  • Type= – определяет, как служба будет запускаться:
    • simple – запускает процесс немедленно, без создания дочерних процессов;
    • forking – запускает службу, которая создает дочерний процесс и завершает родительский. Часто используется для демонов;
    • oneshot – для одноразовых задач, которые завершаются после выполнения;
    • notify – аналогично simple, но с дополнительным уведомлением о готовности;
    • dbus – служба считается готовой, когда определенное имя появляется на шине D-Bus;
    • idle – откладывает запуск службы до завершения всех других задач;
  • PIDFile= – путь к PID-файлу;
  • WorkingDirectory= – рабочий каталог, в котором будет работать процесс;
  • User= – пользователь, от имени которого запускается служба;
  • Group= – группа, от имени которой запускается служба;
  • OOMScoreAdjust= – регулирует приоритет процесса при нехватке памяти;
  • ExecStop= – команда для остановки службы;
  • ExecStart= – команда, которая выполняется при запуске службы;
  • RemainAfterExit= – указывает, что служба считается активной даже после завершения.
  1. Секция [Socket] управляет параметрами сокетов:
  • ExecStart= – команда для запуска;
  • ExecReload= – команда для перезапуска;
  • KillMode= – режим завершения;
  • Restart= – правила перезапуска в случае ошибки.

Пример unit-файла службы:

[Unit]
Description=Пример службы
After=network.target

[Service]
ExecStart=/usr/bin/example-service
Restart=on-failure

[Install]
WantedBy=multi-user.target

Где параметры

  • Description= предоставляет краткое описание службы;
  • After= указывает, что служба должна быть запущена после достижения определенной цели (например, network.target);
  • ExecStart= определяет команду, которую необходимо выполнить для запуска службы;
  • Restart= управляет политикой перезапуска, в данном случае on-failure означает, что служба перезапустится при её сбое;
  • WantedBy= определяет, в каких режимах работы (targets) система должна запускать эту службу.

Различные unit-файлы располагаются в следующих каталогах Системы:

  • /etc/systemd/system/ или /lib/systemd/system/ – для системных файлов. Файлы в этом каталоге имеют приоритет перед другими;
  • /usr/lib/systemd/system/ – для пользовательских unit-файлов;
  • /run/systemd/system/ – для временных unit-файлов, которые генерируются во время работы системы.

Планирование задач с фалами .timer

Файлы .timer предназначены для создания и управления таймерами. В ОС они выполняют роль планировщика задач, являясь частью systemd и заменяя классический cron.

Файлы .timer работают в паре с .service файлами, которые описывают действия, которые должны быть выполнены в запланированное время. Таймеры активируют определённые сервисы в моменты, заданные в конфигурации .timer файла.

Файлы .timer имеют следующую основную структуру:

[Unit]
Description=Описание таймера
Requires=my.service #Запуск таймера, только при наличии соответствующего сервис файла “my.service”

[Timer]
OnCalendar=*-*-* 02:00:00 # Указание расписания (пример: каждый день в 2:00)
Persistent=true           # Выполнять задачу после пропуска, если система была выключена
Unit=my.service  #Таймер, при срабатывании, запускает соответствующий сервис “my.service”

[Install]
WantedBy=timers.target     # Активирует файл .target если есть и запущен timers.target

Рассмотрим основные секции файла .timer

  1. Unit — стандартная секция для всех файлов systemd, содержит описание таймера:
  • Description — краткое описание цели таймера;
  • Requires= — запуск таймера произойдет только если существует соответствующий указанный сервис файл;
  1. Timer — основная секция, где задаются параметры работы таймера:
  • OnCalendar — задаёт расписание запуска (например, ежедневно, ежемесячно, по конкретным датам);
  • OnBootSec= — время после загрузки системы (например, запуск через 5 минут после загрузки);
  • OnUnitActiveSec=— время после последнего запуска службы (например, через 10 минут после последнего выполнения).
  • Persistent= — если true, то задача будет выполнена сразу после включения системы, если во время её выключения был пропущен запуск.
  • Unit= — данный параметр означает, что таймер, при срабатывании, запускает указанный сервис файл.
  1. Install — содержит информацию о том, как таймер должен быть активирован.
  • WantedBy= — если есть и запущен файл timers.target (который активирует все таймеры systemd), то активируется целевой .target файл и начинается отсчет времени таймера.

Элементы расписания OnCalendar

Рассмотрим подробнее возможные значения параметра OnCalendar, который указывает на время или периодичность выполнения задания файла .service.

Формат параметра OnCalendar:

* *-*-* *:*:*
DayOfWeek Year-Month-Day Hour:Minute:Second

Этот формат можно комбинировать или опускать некоторые элементы. Синтаксис параметра поддерживает различные вариации, чтобы можно было точно настроить расписание.

Элементы расписания OnCalendar:

  • DayOfWeek — день недели (Sun, Mon, Tue, Wed, Thu, Fri, Sat).

Mon --* 02:00:00 — каждый понедельник в 2:00.

  • Year-Month-Day — год, месяц и день.

2024-10-01 — 1 октября 2024 года.

  • Использование символов подстановки: * — любая дата (например, --01 означает первый день каждого месяца).

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

  • Hour:Minute — время в формате часов, минут и секунд.

14:30:00 — 14 часов 30 минут ровно.

Если нужно указать только часы и минуты, можно опустить секунды: 14:30.

Рассмотрим примеры параметров OnCalendar:

  1. Ежедневный запуск в полночь:
OnCalendar=daily
  1. Еженедельный запуск (по умолчанию воскресенье в 0:00). :
OnCalendar=weekly
  1. Ежемесячный запуск (в полночь первого числа каждого месяца):
OnCalendar=monthly
  1. Ежегодный запуск (первого января каждого года).
OnCalendar=yearly

или

OnCalendar=annually
  1. Запуск каждый день в 2:00 ночи:
OnCalendar=*-*-* 02:00:00
  1. Запуск по будням в 8:00 утра:
OnCalendar=Mon..Fri *-*-* 08:00:00
  1. Запуск в первый день каждого месяца ровно в полночь:
OnCalendar=*-*-01 00:00:00
  1. Запуск каждый год в конкретный день (например, 25 декабря каждого года):
OnCalendar=*-12-25 00:00:00
  1. Запуск раз в час:
OnCalendar=hourly
  1. Запуск каждые 15 минут:
OnCalendar=*:00/15

Если таймер содержит опцию Persistent=true, это означает, что, если система была выключена в момент времени, когда задача должна была запуститься, она будет выполнена сразу после следующего включения. Это полезно для гарантий выполнения важных задач.

systemd позволяет комбинировать параметры настроек. Например:

OnCalendar=Mon *-*-* 03,15:00:00

Здесь задается запуск задачи каждый понедельник в 3:00 и 15:00.

Чтобы проверить правильность работы таймера, можно использовать команду:

systemctl list-timers

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

Работа таймеров с файлами .service

Для работы таймеров необходимо создать соответствующий файл WantedBy=multi-user.target.service, который описывает, что должно выполняться, когда таймер срабатывает.

  • Файл .timer определяет расписание запуска.
  • Файл .service определяет, что нужно выполнить по этому расписанию.
  • Таймер запускает указанный сервис в момент времени, заданный в .timer файле.

Для примера рассмотрим файл .service для выполнения задачи резервного копирования:

[Unit]
Description=Задача резервного копирования
Wants=my.timer

[Service]
Type=oneshot
ExecStart=/usr/bin/rsync -av /home/ /mnt/backup

[Install]
WantedBy=multi-user.target
  • Параметр Wants=my.timer указывает, что необходимый сервис запустится и будет в режиме ожидания если запущен и работает таймер “my.timer”.
  • Параметр WantedBy=multi-user.target указывает, на каком уровне загрузки Системы будет работать данный сервис.

Основные команда для управления таймерами:

  • Запуск таймера вручную:
sudo systemctl start backup.timer
  • Активация таймера при запуске системы:
sudo systemctl enable backup.timer
  • Проверка статуса таймера:
sudo systemctl status backup.timer
  • Просмотр всех активных таймеров:
systemctl list-timers

Состояние Системы

Состояние системы и набор загружаемых сервисов определяется целями (targets) systemd. Цели (targets) systemd представляют собой группы служб и юнитов, которые должны быть активированы в определенных состояниях системы.

Основные цели systemd:

  • poweroff.target используется для полного отключения системы.
  • rescue.target вводит систему в однопользовательский режим для диагностики и восстановления. Этот режим предназначен для выполнения административных задач, доступных только для root.
  • multi-user.target полный многопользовательский режим с поддержкой сети. Эта цель запускает текстовый интерфейс, и большинство серверов работают именно в этом режиме.
  • graphical.target – запускает систему в многопользовательском режиме с графическим интерфейсом (GUI). Этот режим используется на настольных системах.
  • reboot.target – перезагружает систему.

Помимо стандартных целей, systemd включает и другие специализированные цели:

  • emergency.target - самый минималистичный режим с доступом только к корневой консоли. Используется для восстановления в критических ситуациях.
  • halt.target - Останавливает систему без полного выключения (зависает на экране "halt").
  • suspend.target, hibernate.target, hybrid-sleep.target - Эти цели управляют различными состояниями энергосбережения, такими как приостановка (suspend), гибернация (hibernate) и гибридный сон.
  • Цели (targets) в systemd определены в виде файлов с расширением .target. Системные файлы .target расположены в каталоге /lib/systemd/system/ или /etc/systemd/system/ и отвечают за запуск Системы в указанном состоянии. Пользовательские файлы .target хранятся в /usr/lib/systemd/user/.

Переключаться между целями можно с помощью команды:

systemctl isolate <цель>

Например, чтобы перевести систему в графический режим:

systemctl isolate graphical.target

Чтобы просмотреть активную цель:

systemctl get-default