EK Knowledge

Убунту/Дебиан

Файлы модулей systemd (Unit-файлы)

Файл модуля systemd — это конфигурационный файл в формате, похожем на INI. Он определяет, как systemd управляет определённым ресурсом. Например, файл службы (.service) задаёт, как служба запускается, выполняется и останавливается.

1. Расположение файлов

В зависимости от происхождения и назначения файлы модулей systemd хранятся в разных каталогах.

  • /etc/systemd/system/ — для собственных файлов модулей и локальных переопределений конфигурации.
  • /usr/lib/systemd/system/ — для файлов модулей, предоставляемых операционной системой и установленными пакетами. В старых системах этот путь может также выглядеть как /lib/systemd/system/.

Собственные файлы служб рекомендуется размещать в каталоге /etc/systemd/system/.

2. Основная структура

Типичный файл службы выглядит следующим образом:

[Unit]
Description=My Own Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/my-own-service
Restart=on-failure

[Install]
WantedBy=multi-user.target

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

Раздел Назначение
[Unit] Общее описание, зависимости и порядок запуска
[Service] Выполнение службы и контроль её работы
[Install] Определяет, как служба включается в систему при активации

Не каждый файл модуля должен содержать все три раздела. Допустимые разделы зависят от типа модуля.

3. Синтаксис записей

Обычно запись состоит из ключа, знака равенства и значения:

Key=Value

Примеры:

Description=My Own Service
Restart=on-failure

При этом действуют следующие правила:

  • Регистр символов: имена параметров должны указываться в предусмотренном написании, например ExecStart=.
  • Пустые строки: могут использоваться для улучшения читаемости.
  • Комментарии: строки, начинающиеся с # или ;, считаются комментариями.
  • Значения: обработка пробелов, кавычек и специальных символов зависит от конкретного параметра и правил синтаксиса.
  • Разделы: параметр относится к тому разделу, в котором он определён. Названия разделов заключаются в квадратные скобки.

Пример с комментариями:

[Service]
# Command to start the service
ExecStart=/usr/local/bin/my-own-service

# Restart the service if it fails
Restart=on-failure

4. Раздел [Unit]

Этот раздел содержит общую информацию о модуле, а также сведения о его зависимостях и порядке запуска.

Параметр Описание
Description= Описание модуля
After= Определяет порядок запуска относительно других модулей
Before= Указывает, что этот модуль должен запускаться раньше другого
Requires= Определяет зависимость от других модулей
Wants= Определяет менее строгую зависимость от других модулей

Важно: After=network.target не гарантирует наличие сетевого соединения. Этот параметр определяет только порядок запуска. Зависимости и порядок запуска — разные понятия.

5. Раздел [Service]

Этот раздел определяет, как выполняется служба и как контролируется её работа.

Параметр Описание
Type= Определяет, по каким критериям systemd считает службу запущенной
ExecStart= Команда для запуска службы
ExecStartPre= Команда, выполняемая перед запуском службы
ExecStartPost= Команда, выполняемая после успешного запуска службы
ExecStop= Команда для остановки службы
Restart= Определяет условия автоматического перезапуска службы
User= Пользователь, от имени которого выполняется служба
WorkingDirectory= Рабочий каталог службы
Environment= Задаёт переменные окружения
Распространённые значения Type=
  • simple — служба считается запущенной сразу после запуска её процесса.
  • exec — служба считается запущенной после успешного выполнения указанного процесса.
  • forking — для программ, которые при запуске отделяют дочерний процесс и переходят в фоновый режим.
  • oneshot — для задач, которые выполняются и затем завершаются.
  • notify — для программ, которые явно сообщают systemd о своей готовности.
  • idle — откладывает выполнение до завершения других заданий запуска.

Для многих простых служб подходят значения simple или exec. Выбор зависит от программы и используемой версии systemd.

Распространённые значения Restart=
  • no — без автоматического перезапуска.
  • on-failure — перезапуск при сбое службы.
  • on-abnormal — перезапуск после аварийного завершения, например из-за необработанного сигнала.
  • always — перезапуск независимо от того, завершился ли процесс успешно или с ошибкой.

6. Раздел [Install]

Этот раздел описывает, как модуль включается в систему при активации с помощью systemctl enable.

Параметр Описание
WantedBy= Определяет цель, в структуру зависимостей которой включается модуль при активации
RequiredBy= Определяет цель, для которой при активации создаётся более строгая зависимость от данного модуля
Alias= Определяет дополнительные имена модуля

Часто используется следующая запись:

[Install]
WantedBy=multi-user.target

При активации службы это приводит к включению её в зависимости запуска цели multi-user.target.

Раздел [Install] не обрабатывается при каждом запуске службы. Команда systemctl enable использует его для создания соответствующих символических ссылок.

7. ExecStart= — это не оболочка командной строки

Распространённая ошибка — предполагать, что systemd автоматически выполняет содержимое ExecStart= через командную оболочку.

Следующий пример не запускает конвейер команд оболочки автоматически:

ExecStart=/usr/bin/command1 | /usr/bin/command2

Символ | здесь не интерпретируется как оператор конвейера. Перенаправление вывода с помощью > и запуск в фоновом режиме с помощью & также не работают так, как в командной оболочке.

Если требуется использовать оболочку, её необходимо вызвать явно:

ExecStart=/bin/sh -c 'command1 | command2'

В этом случае конвейер интерпретируется оболочкой.

8. Проверка файлов модулей и применение изменений

Проверка конфигурации

Команду systemd-analyze verify можно использовать для проверки файла модуля на синтаксические и другие ошибки конфигурации:

systemd-analyze verify /etc/systemd/system/my-own-service.service
Повторная загрузка конфигурации

После создания нового файла модуля или изменения существующего файла необходимо повторно загрузить конфигурацию systemd:

systemctl daemon-reload
Запуск службы
systemctl start my-own-service
Просмотр состояния службы
systemctl status my-own-service
Включение автоматического запуска
systemctl enable my-own-service
Запуск службы и включение автоматического запуска
systemctl enable --now my-own-service

9. Официальная документация