30 марта 2018

Systemd: Создание Сервиса — Примеры

Большинство дистрибутивов Linux в качестве менеджера системы и сервисов используют systemd.

systemctl является основной командой для управления сервисами в systemd.

В данной статье я покажу, как создать service-файл в systemd, который позволит управлять вашим сервисом с помощью команды systemctl, как без перезагрузки перезапустить systemd, чтобы он перечитал unit-файлы и как активировать ваш новый сервис.

Также я приведу описание наиболее важных опций используемых в service-файлах с примерами реальных service-файлов.

Создание Сервиса в Systemd

Создайте service-файл /etc/systemd/system/foo-daemon.service (замените foo-daemon на имя вашего сервиса):

Откройте файл foo-daemon.service и пропишите минимальные настройки, которые позволят управлять сервисом с помощью systemctl:

Путь К Демону: Если вы не знаете путь к демону, попробуйте which foo-daemon.

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

Теперь вы можете делать start, stop, restart и проверять status сервиса:

Чтобы добавить сервис в автозагрузку, необходимо активировать его:

Чтобы проверить логи сервиса, выполните:

Опции Service-файла в Systemd

Service-файла в systemd обычно состоит из трех секций.

Общие элементы конфигурации сервиса настраиваются в секциях [Unit] и [Install]

Параметры конфигурации конкретного сервиса настраиваются в секции [Service].

Важные Опции Секции [Unit]

ОпцияОписание
DescriptionКраткое описание юнита.
DocumentationСписок ссылок на документацию.
Before, AfterПорядок запуска юнитов.
RequiresЕсли этот сервис активируется, перечисленные здесь юниты тоже будут активированы. Если один из перечисленных юнитов останавливается или падает, этот сервис тоже будет остановлен.
WantsУстанавливает более слабые зависимости, чем Requires. Если один из перечисленных юнитов не может успешно запуститься, это не повлияет на запуск данного сервиса. Это рекомендуемый способ установления зависимостей.
ConflictsЕсли установлено что данный сервис конфликтует с другим юнитом, то запуск последнего остановит этот сервис и наоборот.

Список всех опций секции [Unit]:

Важные Опции Секции [Install]

ОпцияОписание
AliasДополнительные имена сервиса разделенные пробелами. Большинство команд в systemctl, за исключением systemctl enable, могут использовать альтернативные имена сервисов.
RequiredBy, WantedByДанный сервис будет запущен при запуске перечисленных сервисов. Для более подробной информации смотрите описание опций Wants и Requires в секции [Unit].
AlsoОпределяет список юнитов, которые также будут активированы или дезактивированы вместе с данным сервисом при выполнении команд systemctl enable или systemctl disable.

Список всех опций секции [Install]:

Важные Опции Секции [Service]

ОпцияОписание
TypeНастраивает тип запуска процесса. Один из:
simple (по умолчанию) — запускает сервис мгновенно. Предполагается, что основной процесс сервиса задан в ExecStart.
forking — считает сервис запущенным после того, как родительский процесс создает процесс-потомка, а сам завершится.
oneshot — аналогичен типу simple, но предполагается, что процесс должен завершиться до того, как systemd начнет отслеживать состояния юнитов (удобно для скриптов, которые выполняют разовую работу и завершаются). Возможно вы также захотите использовать RemainAfterExit=yes, чтобы systemd продолжал считать сервис активным и после завершения процесса.
dbus — аналогичен типу simple, но считает сервис запущенным после того, как основной процесс получает имя на шине D-Bus.
notify — аналогичен типу simple, но считает сервис запущенным после того, как он отправляет systemd специальный сигнал.
idle — аналогичен типу simple, но фактический запуск исполняемого файла сервиса откладывается, пока не будут выполнены все задачи.
ExecStartКоманды вместе с аргументами, которые будут выполнены при старте сервиса. Опция Type=oneshot позволяет указывать несколько команд, которые будут выполняться последовательно. Опции ExecStartPre и ExecStartPost могут задавать дополнительные команды, которые будут выполнены до или после ExecStart.
ExecStopКоманды, которые будут выполнены для остановки сервиса запущенного с помощью ExecStart.
ExecReloadКоманды, которые будут выполнены чтобы сообщить сервису о необходимости перечитать конфигурационные файлы.
RestartЕсли эта опция активирована, сервис будет перезапущен если процесс прекращен или достигнут timeout, за исключением случая нормальной остановки сервиса с помощью команды systemctl stop
RemainAfterExitЕсли установлена в значение True, сервис будет считаться запущенным даже если сам процесс завершен. Полезен с Type=oneshot. Значение по умолчанию False.

Список всех опций секции [Service]:

Примеры Service-файлов в Systemd

Больше примеров в документации по systemd.service и systemd.unit.

23 декабря 2016

Логирование в systemd

Введение

Одним из значимых преимуществ systemd является его возможность работы с логами процессов и системы в целом. При использовании остальных инструментов, отличных от systemd, логи обычно сильно децентрализованы, разбросаны по разным демонам, что затрудняет управление ими. Система, собирающая логи, и управляющая ими называется журналом.
Журнал представлен демоном journald, который собирает сообщения ядра, сервисов, процессов и т.д. Мы же разберёмся, как работать с journalctl, позволяющим управлять записями, сохранёнными в журнале.
Логи, собранные в systemd, сохраняются централизованно — в двоичном формате, что сильно упрощает их обработку. Например, можно выбирать произвольные форматы вывода логов, в зависимости от текущих потребностей (например, JSON).
Журнал systemd может использоваться вместе с системной реализацией журнала, либо вообще заменить его.

Читать далее
12 декабря 2016

Введение в systemd. Сервисы, юниты

Введение

В последнее время многие дистрибутивы Linux перешли на systemd с других демонов инициализации (например, upstart). Systemd является гибким и быстрым инструментом для управления сервером с момента загрузки.

В данном руководстве мы рассмотрим наиболее важные команды для управления сервером с systemd.

Читать далее