Поиск по сайту:

Как добавить свои собственные службы в systemd для упрощения управления


Серверы Linux предназначены для постоянной работы; вместо того, чтобы запускать важные программы вручную и оставлять их в сеансе tmux , вам следует добавить их в systemd как службу, которая будет автоматически запускаться при загрузке и перезапускаться в случае возникновения ошибок.

Работа с Systemd и службами

Systemd хранит конфигурацию сервисов в двух местах. Первый — это /lib/systemd/system/, где вы найдете конфигурацию для многих служб в вашей системе. Здесь устанавливаются службы установки большинства программ. Второй — /etc/systemd/system/, который переопределяет каталог /lib/systemd и обычно используется для размещения в нем сервисов, созданных пользователями. Также есть /etc/systemd/users/, который запускает службы для отдельных вошедших в систему пользователей, например получение почты.

Многие из этих сервисов не работают постоянно, как nginx или MySQL. Вы можете распечатать список используемых в данный момент сервисов с помощью:

service --status-all

Службы со знаком «+» запущены, а службы со знаком «-» в данный момент остановлены. Вы можете просмотреть более подробную информацию с помощью:

service status nginx

Поскольку службы работают в фоновом режиме, они не записывают свои выходные данные в вашу консоль, а записывают их в журнал systemd. Команда «status» покажет последние несколько строк этого журнала, но вы можете прочитать его напрямую с помощью:

journalctl -fn 50 -u nginx

Эта команда печатает последние 50 записей журнала (-n) из службы nginx (-u). Он настроен так, чтобы печатать все и начинать снизу, следуя за новыми записями журнала по мере их создания (-f).

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

Простая настройка службы

Systemd используется в Linux для многих вещей; каждый объект, которым он управляет, называется единицей и имеет соответствующий «файл единицы», определяющий, что они из себя представляют. Это могут быть простые сервисы, такие как nginx или MySQL, но они также могут быть такими вещами, как точки монтирования, устройства, сокеты и множество других скрытых вещей, которыми управляет systemd. Единицы также могут быть целями, используемыми для управления запуском других служб (т. е. после инициализации сети).

Однако для этого варианта использования вы, вероятно, просто захотите настроить свое приложение как базовую службу. Для этого вам нужно будет создать новый файл модуля, который вы захотите поместить в /etc/systemd/system/ и назвать .service. расширение:

touch /etc/systemd/system/myapp.service

Файлы модулей имеют несколько разных разделов, но в целом они будут выглядеть примерно так:

[Unit]
Description=Example Service
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=serviceuser
ExecStartPre=
ExecStart=/path/to/executable [options]
ExecStartPost
ExecStop=
ExecReload=

[Install]
WantedBy=multi-user.target

Во-первых, раздел [Unit] , который определяет набор метаданных об устройстве. Директиву After= можно использовать для задержки активации модуля до тех пор, пока не будет запущен другой модуль, например network, или другая служба, например mysql.service. Это не делает его жестко зависимым от этой службы, хотя вы можете сделать это с помощью директив Requires= или Wants= . В этом разделе также настраивается максимальное количество попыток запуска модуля, прежде чем systemd полностью сдастся; поскольку вы, вероятно, хотите, чтобы он продолжал попытки, вы можете установить это значение на 0, чтобы отключить это поведение.

Далее следует раздел [Service] , относящийся к файлам единиц обслуживания. Здесь вы настроите параметры Exec. Пользователь запустит службу от имени определенного пользователя. Вы можете установить это на свою личную учетную запись пользователя, корневую или пользовательскую учетную запись службы. Просто убедитесь, что у пользователя достаточно прав для выполнения своей работы.

Здесь есть несколько различных директив для указания запускаемых программ. ExecStartPre запустится первым, что позволит вам выполнить все необходимые настройки до того, как служба действительно запустится. ExecStart – основной исполняемый файл. ExecStartPost запускается позже, а ExecStop запускается при завершении работы службы. ExecReload – это специальная директива, которая используется, когда вы вызываете «перезагрузку» вместо перезапуска. Это позволяет вам выполнять перезагрузку конфигурации во время выполнения, если ваше приложение имеет такую возможность.

И, наконец, раздел [Install] , который определяет некоторые дополнительные действия, связанные с тем, как systemd обрабатывает модуль. Чаще всего это используется для указания директивы WantedBy=, которая сообщает systemd, когда запускать службу, и создает символические ссылки между целями и их зависимыми единицами. Если вы не знаете, какую цель использовать, multi-user.target будет запускать службы при запуске после того, как почти все будет загружено.

В целом, настройка довольно проста, и все, что вам действительно нужно сделать, это указать исполняемый файл в качестве аргумента в разделе [Service] . Как только ваша служба будет создана, вам нужно будет перезагрузить демон systemctl, чтобы он обновился с вашими изменениями:

sudo systemctl daemon-reload

И включите его (который будет запускать его при загрузке в соответствии с конфигурацией устройства):

sudo systemctl enable myapp

Затем запустите службу:

sudo service myapp start

Теперь служба должна работать в фоновом режиме, и вы можете проверить journalctl, чтобы просмотреть ее выходные данные. Если он завершится, systemd автоматически запустит его снова, и он должен запускаться при загрузке вместе с другими службами в вашей системе.

Если вам нужно перезапустить службу, вы можете использовать:

sudo service myapp restart

Который выполнит директиву ExecStop= , выключит устройство, а затем снова запустит его.