systemd service — управление сервисами через systemctl


systemd service — способ управления службами на Linux сервере, применяющийся в большинстве современных дистрибутивов. systemd позволяет останавливать и запускать службы и следить за их работой.

Таким образом легко контролировать также собственные демоны, которые, например, должны запускаться автоматически после перезагрузки сервера.



systemd service и управление службами


Пакет SystemD работает на серверах с операционными системами Debian, CentOS, Ubuntu и других.



SystemD это система инициализации служб на сервере, позволяющая ими гибко управлять. Современный аналог применявшихся раньше upstart и init.



Какая именно система инициализации применяется в качестве основной можно выяснить так

file /sbin/init

/sbin/init: symbolic link to /lib/systemd/systemd

В выводе systemd и именно эта система используется — другие варианты это upstart и SysV.



Символьная ссылка нужна для обеспечения обратной совместимости. Фактически в современных дистрибутивах тоже есть скрипты init.d (система инициализации SysV), ими при желании можно пользоваться, но система использует systemd.



Все новые сервисы (в том числе собственные) на современной машине лучше всего запускать именно через Systemd service.

systemd оперирует понятием 'unit', самый распространенный тип среди них — service. Это служба, которую systemd запускает на основе unit файла, затем systemd отслеживает её состояние и управляет им, ведет логи.


Управление сервисами производится командой systemctl



Пример управления сервисом через systemctl


Устанавливаем Nginx на Ubuntu сервере используя пакетный менеджер apt

apt install nginx



Вместе с самим пакетом будет добавлен сервис nginx.service, полный путь к Unit файлу /lib/systemd/system/nginx.service



Путь видно при выполнении systemctl status nginx.service

systemctl status nginx


● nginx.service — A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/nginx.service.d
└─override.conf
Active: active (running) since Fri 2022-09-02 02:58:58 UTC; 1 months 12 days ago



Файл можно открыть текстовым редактором, при необходимости внести изменения (для Nginx обычно не требуется)



Пример Unit файла Nginx:

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target


Если в файлы сервисов вносятся какие-то изменения нужно выполнять после их редактирования systemctl daemon-reload



И затем перезапускать сервис

systemctl restart nginx.service



Чтобы система автоматически запускала сервис после перезаагрузки нужно выполнить для сервиса команду enable (чтобы убрать из автозагрузки — disable)

systemctl enable nginx.service



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

  • если сервис свой, добавленный вручную, не Nginx как в примере
  • если на сервере CentOS



Для установленных с помощью пакетного менеджера служб unit файлы добавляются автоматически. Для Ubuntu, Debian автозагрузка включается по умолчанию, в CentOS — нет.


После enable установленная из репозитория или пользовательская  служба будет стартовать каждый раз при загрузке. Можно выполнять команду после каждой операции установки пакета или добавления Unit файла.



Остановка службы

systemctl stop nginx.service



Запуск

systemctl start nginx.service

systemd service


Команда для перечитывания конфигурационных файлов при сохранении процесса (аналог nginx -s reload)

systemctl reload nginx.service



Поиск ошибок в работе сервисов под контролем systemd


Если возникают какие-то ошибки можно посмотреть логи службы

journalctl -b -u nginx.service

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

Подробнее про систему журналирования journald



Список всех сервисов systemd


Полный список управляемых systemd служб можно увидеть выполнив

systemctl list-units

Далее из вывода можно делать выборку с помощью grep


Пример поиска по списку сервисов:

systemd list-units



Systemd очень удобно использовать добавляя собственные Unit-файлы. Они простые, для запуска сервиса достаточно обычно 10 строк. Пример можно посомтреть в материале про настройку работы проектов на NodeJS.



Важная функция — отслеживание процесса и перезапуск сервиса в случае если процесс перестал существовать. В Systemd это реализовано по умолчанию (директива Restart=always в блоке Service Unit файла) и не требуется прибегать к дополнительным сервисам вроде supervisor.

Сказать спасибо