Продвинутым
August 24, 2021

Параметры сервисного файла

1package & Let's Node

Systemd предоставляет большое количество параметров для настройки сервисного файла. Самые полезные описаны в этой статье.


Содержание

Что такое сервисный файл?

Параметры сервисного файла


Вступление

К содержанию

⠀Общая информация о сервисном файле и о взаимодействии с ним изложена в статье для новичков.

⠀Если в параметре можно использовать несколько значений, то они разделяются пробелами, при этом может использоваться одно значение.


[Unit]

К содержанию

⠀Данный раздел содержит общую информацию о юните, не зависящую от его типа.

Description

⠀Краткое название юнита, используемое различными пользовательскими интерфейсами. Желательно, чтобы оно было именем существительным.

Documentation

⠀Список URL, ссылающихся на документацию для данного юнита.

Wants

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

Requires

⠀Схоже с Wants, за исключением более сильной зависимости — текущий юнит будет остановлен, если один из указанных будет остановлен.

PartOf

⠀Зависимости аналогичны Requires. При остановке или перезапуске перечисленных юнитов при помощи systemd действие распространяется и на текущий юнит. При этом зависимость не имеет обратной силы.

Before

⠀Текущий юнит будет запущен перед запуском указанных.

After

⠀Текущий юнит будет запущен после запуска указанных.

StartLimitIntervalSec=interval, StartLimitBurst=burst

⠀Ограничение количества успешных запусков юнита за указанный период времени. Для обнуления ограничения необходимо использовать команду systemctl reset-failed.


[Service]

К содержанию

⠀Данный раздел определяет юнит как сервисный файл и содержит необходимую для его работы информацию.

Type

⠀Задаёт тип запуска команды сервисного файла. Исходя из того, как ведёт себя команда при ручном запуске из терминала, необходимо выбрать одно из значений:

  • simple (значение по умолчанию) — systemd будет считать юнит запущенным сразу после того, как основной процесс службы будет разветвлён на несколько процессов. При этом systemctl start будет сообщать об успешном запуске, даже если сервисный файл запустился неуспешно (например, потому что указанный пользователь не существует или файл службы отсутствует). Следует использовать с непрерывной командой, когда для получения доступа к терминалу необходимо прервать её выполнение, например, сочетанием клавиш Ctrl + C;
  • exec (отсутствует в старых версиях systemd) — аналогичен simple за исключением того, что systemd будет считать юнит успешно запущенным только после успешного запуска сервисного файла;
  • forking — ожидается, что основной процесс запустит фоновый и завершится. При этом дочерний процесс продолжит выполняться как основной процесс службы. Следует использовать, если команда запускает фоновый процесс и завершается после этого, например запуск Bash скрипта;
  • oneshot — поведение аналогично simple, однако systemd будет считать юнит завершённым после завершения основного процесса. Следует использовать, если команда выполняется и через небольшой промежуток времени завершается.

User

⠀Устанавливает пользователя, от имени которого выполняются процессы. Принимает в качестве аргумента одно имя пользователя или числовой идентификатор. По умолчанию используется User=root.

Group

⠀Устанавливает группу, от имени которой выполняются процессы. Принимает в качестве аргумента одно имя группы или числовой идентификатор. По умолчанию используется группа пользователя по умолчанию.

Environment

⠀Задаёт переменные окружения для выполняемых процессов. Если необходимо присвоить переменной значение, содержащее пробелы или знак равенства, необходимо поставить кавычки вокруг всего присваиваемого значения. Символ $ не имеет специального значения.

⠀Нежелательно использовать для передачи секретных значений (пароли и т. п.)

⠀Два примера ниже зададут переменные VAR1, VAR2 и VAR3 со значениями word1 word2, word3 и $word 5 6 соответственно.

# В виде одного параметра
Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6"
# В виде нескольких параметров
Environment="VAR1=word1 word2"
Environment=VAR2=word3
Environment="VAR3=$word 5 6"

EnvironmentFile

⠀Аналогично Environment, однако считывает переменные окружения из текстового файла.

⠀Правила:

  • Каждая переменная начинается с новой строки;
  • Пустые строки, строки без = или строки, начинающиеся с ; или #, будут проигнорированы, поэтому могут быть использованы для комментирования;
  • Строка, заканчивающаяся \, будет склеена со следующей;
  • Пробелы в начале и в конце значений удаляются, если не используются двойные кавычки;
  • В значениях можно использовать табуляцию \t и переход на новую строку \n.

WorkingDirectory

⠀Абсолютный путь до директории, из которой выполняются процессы. Если задано значение ~, то используется домашний каталог пользователя, указанного в User. Если значение не задано, то по умолчанию используется корневой каталог, если systemd запущен как экземпляр системы, и домашний каталог соответствующего пользователя, если запущен от имени пользователя.

ExecStart

⠀Запускаемая сервисным файлом команда, только при Type=oneshot может быть несколько команд. Желательно использовать абсолютный путь к исполняемому файлу (можно узнать командой which COMMAND).

ExecStartPre

⠀Дополнительные команды, которые выполняются до ExecStart. Допускается использование нескольких команд или нескольких параметров ExecStartPre, при этом команды выполняются последовательно. Команды в ExecStart выполняются только после успешного завершения всех команд ExecStartPre. Для игнорирования неуспешного запуска перед командой необходимо добавить префикс -.

ExecReload

⠀Команда, которую необходимо выполнить, чтобы вызвать перезагрузку службы, вызванной при помощи ExecStart. В параметре установлена переменная $MAINPID, указывающая на PID главного процесса, и может использоваться в командах типа:

ExecReload=/bin/kill -HUP $MAINPID

⠀Однако перезагрузка службы приведённым выше образом обычно не является хорошим выбором, поскольку это асинхронная операция, которая не подходит для последовательной перезагрузки нескольких связных служб.

ExecStop

⠀Команда, которую необходимо выполнить, чтобы вызвать остановку службы, вызванной при помощи ExecStart. После её выполнения подразумевается, что служба и все дочерние процессы остановлены. В параметре установлена переменная $MAINPID, указывающая на PID главного процесса, однако она будет пустой в случае, если главный процесс уже завершён.

⠀Данная команда также выполняется при перезагрузке службы командой systemctl restart.

Restart

⠀При каком типе сигнала выхода повторно запустить внезапно выключившуюся программу.

⠀Принимает одно из значений no (по умолчанию), always, on-success, on-failure, on-abnormal, on-abort, on-watchdog:

RestartSec

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

RestartSec=10
RestartSec="1min 10s"

Limit...

⠀Установка мягких и жестких ограничений на различные ресурсы для выполняемых процессов, эквивалентных установленным командой ulimit.

⠀Все возможные параметры с их описанием:

⠀Ограничения могут быть заданы в двух форматах:

  • Как единое значение, устанавливающий одновременно мягкий и жесткий лимит на одно и то же значение;
  • Как пара soft:hard, разделенная двоеточием, чтобы установить оба лимита по отдельности. Например LimitAS=4G:16G.

[Install]

К содержанию

⠀Данный раздел содержит информацию для установки юнита. Его содержимое активируется/деактивируется при выполнении команд systemctl enable/disable.

Alias

⠀Список дополнительных названий, которые можно будет использовать при управлении юнитом. Перечисленные названия должны иметь тот же тип, что и имя файла юнита (например .service).

⠀Например, если при создании сервиса с названием hello.service задать параметр:

Alias=hi.service

⠀А затем, активировать раздел командой systemctl enable, то название hi.service будет эквивалентно названию hello.service.

WantedBy

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

RequiredBy

⠀Схоже с WantedBy, за исключением более сильной зависимости — если текущий юнит будет остановлен, то указанные будут также остановлены.

Also

⠀При использовании system enable/disable на текущем юните, действие распространится на указанные.


Полезные ссылки

К содержанию

Описание разделов Unit и Install (EN) | Описание раздела Service (EN)

Описание общих параметров раздела Service (EN)

Команда unlimit (EN) | Команда unlimit | Коды выхода | Сигналы


Благодарности

К содержанию

Команда 1package — написание статьи

Выразить благодарность