Убунту/Дебиан
Файлы модулей 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