Васильев Андрей Михайлович, 2024
Версии презентации
Служба обычно представляет собой некоторое приложение, которое постоянно запущено и которое предоставляет полезные услуги пользователю или другим приложениям
Службы также могут представлять собой действия, выполняющиеся с некоторой регулярностью, например по расписанию
Точное указание зависимостей позволяет ускорить загрузку системы, избежать проблем при запуске служб
Вопрос запуска службы помимо момента запуска достаточно сложный:
Помимо запуска есть много вопросов поддержки работы:
Задача настройки параметров запуска службы достаточно сложная, разработчиками SysVInit решена не была, поэтому процесс запуска служб делегировали Shell-скриптам
Каждый из последних потребуют написания своей конфигурации
Для описания всех компонентов systemd используются файлы модулей (unit), в которых описывается поведение конкретного компонента. В настоящий момент systemd поддерживает следующие виды модулей:
| Тип модуля | Описание |
|---|---|
| Target | Синхронизационная точка для ряда модулей. Используется во время загрузки системы в определённом состоянии. |
| Service | Модуль, который запускает, останавливает, перезапускает, даёт команду на обновление конфигурации различных служб, например Веб-сервер. |
| Timer | Модуль данного типа активирует или деактивирует указанную службу по времени наступления таймера или истечения времени. |
| Socket | Модуль данного типа активирует или деактивирует службу, когда приходит входящее подключение по указанному сокету. |
| Device | A unit of this type implements device-based activation such as a device driver. |
| Тип модуля | Описание |
|---|---|
| Mount | A unit of this type controls the file-system mount point. |
| Automount | A unit of this type provides and controls on-demand mounting of file systems. |
| Swap | A unit of this type encapsulates/activates/deactivates swap partition. |
| Path | A unit of this type monitors files/directories and activates/deactivates a service if the specified file or directory is accessed. |
| Snapshot | A unit that creates and saves the current state of all running units. This state can be used to restore the system later. |
| Slice | A group of units that manages system resources such as CPU, and memory. |
| Scope | A unit that organizes and manages foreign processes. |
| busname | A unit that controls DBus system. |
Список можно посмотреть в man-руководстве systemd.unit
/etc/systemd/system.control/*/run/systemd/system.control/*/etc/systemd/system/* — Файлы, созданные администратором/run/systemd/system/*/lib/systemd/system/* — Файлы, установленные вместе с пакетом приложения~/.config/systemd/user.control/*~/.config/systemd/user/*$XDG_CONFIG_DIRS/systemd/user/*/etc/systemd/user/*$XDG_RUNTIME_DIR/systemd/user/*/run/systemd/user/*Конфигурационные файлы служб systemd являются текстовыми файлами в формате INI
systemd.unit, systemd.service, systemd.timer и т.д[Unit]
Description=Start n service
After=default.target
[Service]
Type=simple
ExecStart=/usr/bin/n
[Install]
WantedBy=default.targetUnit описывает общую информацию о службе, часть unit-файлов
Description — краткое описание назначения службеAfter — указание зависимости одной службы от другойInstall описывает параметры автоматического запуска службы при старте системы, часть unit-файлов
Type — поведение приложения после запускаWantedBy — указание зависимости от цели запускаService описывает детали запуска службы
ExecStart — команда для запуска приложения, должна включать полный путь к исполняемому файлу, может включать аргументыТребований к параметрам работы служб много — скорее всего на настоящий момент в systemd есть поддержка для решения данной задачи
Если не указать пользователя, то приложение будет работать с правами суперпользователя, что является проблемой для большинства служб
В секции Service необходимо указать пользователя с помощью параметра User
Служба не всегда ведёт себя как следует и может упасть. Политика перезапуска определяется в секции Service с помощью параметра Restart
on-failure — перезапускать в случае паденияalways — перезапускать даже когда хорошо завершилось/etc/systemd/system
.serviceexample.service[Unit], указав описание и зависимости[Service], указав параметры запуска приложения[Install], указав параметры автоматического запускаsystemctl daemon-reloadsystemctl start example или целиком systemctl start example.servicesystemctl status exampleДля остановки службы используйте команду systemctl stop example
Команды start и stop приложения systemctl пытаются запустить или остановить процесс, который находится под управлением systemd
Для настройки автоматического запуска необходимо:
[Install] внутри конфигурационного файлаsystemctl enable example.serviceПоследняя команда настраивает запуск службы при старте ОС, не запускает её сейчас
start--now: systemctl enable --now example.start. В этом случае будет настроен автоматический запуск при старте и будет выполнена попытка запуска службы сейчасДля выключения автоматического systemctl disable example или systemctl disable --now example
Анализ поведения системы
| Дейтвие | Команда |
|---|---|
| Отобразить состояние systemd | systemctl status |
| Отобразить список запущенных модулей | systemctl или systemctl list-units |
| Отобразить список упавших модулей | systemctl --failed |
| Отобразить список конфигурационных файлов модулей | systemctl list-unit-files |
| Отобразить статус модуля по PID процесса | systemctl status PID |
Анализ поведения службы
| Дейтвие | Команда | Комментарий |
|---|---|---|
| Отобразить страницу руководства, ассоциированную с данной службой | systemctl help UNIT |
если указана в конфигурации модуля |
| Отобразить статус модуля | systemctl status UNIT |
показывает запущен или остановлен модуль |
| Проверить включён ли модуль | systemctl is-enabled UNIT |
Управление состоянием службы. Все в данном разделе требуют прав суперпользователя
| Дейтвие | Команда |
|---|---|
| Запустить модуль | systemctl start UNIT |
| Остановить работу модуля | systemctl stop UNIT |
| Перезапустить модуль | systemctl restart UNIT |
| Дать команду службе перечитать конфигурацию | systemctl reload UNIT |
| Перечитать конфигурацию systemd | systemctl daemon-reload |
| Настроить автоматический запуск модуля при старте системы | systemctl enable UNIT |
| Настроить автоматический запуск модуля при старте системы и сразу запустить его | systemctl enable --now UNIT |
| Отключить автоматический запуск модуля при старте системы | systemctl disable UNIT |
| Отключить и настроить автоматический запуск модуля | systemctl reenable UNIT |
Данные действия надо выполнять от имени суперпользователя
| Дейтвие | Команда |
|---|---|
| Выключить ОС и перезагрузить компьютер | systemctl reboot |
| Выключить ОС и обесточить компьютер | systemctl poweroff |
| Приостановить работу ОС с сохранением данных в оперативной памяти | systemctl suspend |
| Приостановить работу ОС с сохранением данных в разделе подкачки | systemctl hibernate |
| Приостановить работу ОС с гибридным сохранением состояния | systemctl hybrid-sleep |