Управление службами Systemd. Часть 1 из 3

05.01.2020

Теги: CLILinuxSystemdКомандаСерверФайл

Systemd — это система инициализации и системный менеджер, который становится новым стандартом для Linux. Systemd управляет юнитами, которые определяются в так называемых юнит-файлах. Cамым распространённым юнитом является сервис (файл с расширением .service). Основной инструмент для управления сервисами — команда systemctl.

Управление сервисами

Основная цель Systemd — инициализировать компоненты, которые должны запускаться после загрузки ядра Linux. Systemd (и команда systemctl) также используется для управления сервисами и демонами сервера.

Запуск и остановка сервиса

Для запуска сервиса предназначена команда start:

$ sudo systemctl start application.service

Чтобы остановить сервис, достаточно ввести команду stop:

$ sudo systemctl stop application.service

Перезапуск и перезагрузка

Для запуска сервиса systemd предназначена команда restart:

$ sudo systemctl restart application.service

Если приложение может перезагрузить свои конфигурационные файлы (без перезапуска), можно использовать команду reload:

$ sudo systemctl reload application.service

Если не известно, может ли сервис перезагрузить свои файлы, тогда используется команда reload-or-restart. Она перезагрузит сервис, а если это невозможно — перезапустит его.

$ sudo systemctl reload-or-restart application.service

Включение и отключение сервисов

Приведенные выше команды необходимы при работе с сервисом в текущей сессии. Чтобы добавить сервис в автозагрузку Systemd, его нужно включить. Для этого существует команда enable:

$ sudo systemctl enable application.service

Это создаст символическую ссылку на файл сервиса (этот файл обычно расположен в /lib/systemd/system или /etc/systemd/system) в специальном каталоге, где Systemd ищет файлы для автозапуска (обычно /etc/systemd/system/something.target.want).

Посмотрим содержимое каталога /etc/systemd/system и отфильтруем только директории *.wants:

$ cd /etc/systemd/system
$ ls | grep wants
bluetooth.target.wants
..........
multi-user.target.wants
..........
timers.target.wants

Заглянем в директорию bluetooth.target.wants:

$ ls -l bluetooth.target.wants
0 lrwxrwxrwx 1 root root 37 ноя 13 13:52 bluetooth.service -> /lib/systemd/system/bluetooth.service
$ cat bluetooth.target.wants/bluetooth.service
[Unit]
Description=Bluetooth service
Documentation=man:bluetoothd(8)
ConditionPathIsDirectory=/sys/class/bluetooth

[Service]
Type=dbus
BusName=org.bluez
ExecStart=/usr/lib/bluetooth/bluetoothd
NotifyAccess=main
#WatchdogSec=10
#Restart=on-failure
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
LimitNPROC=1
ProtectHome=true
ProtectSystem=full

[Install]
WantedBy=bluetooth.target
Alias=dbus-org.bluez.service

Заглянем в директорию multi-user.target.wants:

$ ls -l
drwxr-xr-x  2 root root 4096 ноя 13 15:27  .
drwxr-xr-x 18 root root 4096 янв  6 14:32  ..
lrwxrwxrwx  1 root root   35 ноя 13 13:52  anacron.service -> /lib/systemd/system/anacron.service
lrwxrwxrwx  1 root root   40 ноя 13 13:52  avahi-daemon.service -> /lib/systemd/system/avahi-daemon.service
lrwxrwxrwx  1 root root   41 ноя 13 13:52  console-setup.service -> /lib/systemd/system/console-setup.service
lrwxrwxrwx  1 root root   32 ноя 13 13:52  cron.service -> /lib/systemd/system/cron.service
lrwxrwxrwx  1 root root   40 ноя 13 13:52  cups-browsed.service -> /lib/systemd/system/cups-browsed.service
....................

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

$ sudo systemctl disable application.service

Это удалит символическую ссылку, после этого сервис перестанет запускаться автоматически.

Проверка состояния сервиса

Для проверки состояния сервиса предназначена команда status:

$ systemctl status application.service

Эта команда выведет состояние сервиса, иерархию групп и первые несколько строк лога. Например, при проверке состояния сервера Nginx, можно увидеть такой вывод:

$ 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)
   Active: active (running) since Mon 2020-01-06 10:15:31 EET; 4min 3s ago
     Docs: man:nginx(8)
  Process: 677 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 639 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 688 (nginx)
    Tasks: 2 (limit: 3542)
   CGroup: /system.slice/nginx.service
           ├─688 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─689 nginx: worker process

янв 06 10:15:30 ubuntu-lemp systemd[1]: Starting A high performance web server and a reverse proxy server...
янв 06 10:15:31 ubuntu-lemp systemd[1]: nginx.service: Failed to parse PID from file /run/nginx.pid: Invalid argumen
янв 06 10:15:31 ubuntu-lemp systemd[1]: Started A high performance web server and a reverse proxy server.

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

$ systemctl is-active application.service
$ systemctl is-enabled application.service
$ systemctl is-failed application.service

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

Обзор состояния системы

Ранее мы рассмотрели команды, необходимые для управления отдельными сервисами, но они не очень полезны для изучения текущего состояния системы. Существует несколько команд systemctl, которые предоставляют эту информацию.

Просмотр списка текущих юнитов

Для просмотра списка текущих юнитов предназначена команда list-units:

$ systemctl list-units
UNIT                                                              LOAD    ACTIVE  SUB      DESCRIPTION
---------------------------------------------------------------------------------------------------------------------
sys-devices-pci0000:00-0000:00:03.0-net-enp0s3.device             loaded  active  plugged  82540EM Gigabit Ethernet C
sys-devices-pci0000:00-0000:00:05.0-sound-card0.device            loaded  active  plugged  82801AA AC'97 Audio Contro
....................
phpsessionclean.timer                                             loaded  active  waiting  Clean PHP session files ev
systemd-tmpfiles-clean.timer                                      loaded  active  waiting  Daily Cleanup of Temporary

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

178 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

В выводе есть такие столбцы:

  • UNIT — название юнита
  • LOAD — конфигурация юнита обработана?
  • ACTIVE — сводное состояние юнита (запущен или нет)
  • SUB — состояние более низкого уровня
  • DESCRIPTION — краткое описание функций юнита

Поскольку команда list-units показывает по умолчанию только активные юниты, все записи будут показывать loaded в столбце LOAD и active в столбце ACTIVE.

Чтобы увидеть все юниты, которые загрузила (или попыталась загрузить) система Systemd, независимо от того, активны ли они в данный момент:

$ systemctl list-units --all
После запуска многие юниты становятся неактивными, а некоторые юниты, которые пыталась загрузить Systemd, не были найдены на диске.

Можно использовать другие флаги для фильтрации результатов. Например, флаг state можно использовать для определения состояний LOAD, ACTIVE или SUB. Флаг all нужно оставить, чтобы система отображала неактивные юниты:

$ systemctl list-units --all --state=inactive

Еще один популярный фильтр — это type:

$ systemctl list-units --type=service

Флаги можно комбинировать:

$ systemctl list-units --type=service --state=not-found
  UNIT                           LOAD       ACTIVE    SUB   DESCRIPTION
-----------------------------------------------------------------------------------------
● auditd.service                 not-found  inactive  dead  auditd.service
● connman.service                not-found  inactive  dead  connman.service
● console-screen.service         not-found  inactive  dead  console-screen.service
● festival.service               not-found  inactive  dead  festival.service
● kbd.service                    not-found  inactive  dead  kbd.service
● oem-config.service             not-found  inactive  dead  oem-config.service
● resolvconf.service             not-found  inactive  dead  resolvconf.service
● sssd.service                   not-found  inactive  dead  sssd.service
● systemd-sysusers.service       not-found  inactive  dead  systemd-sysusers.service
● systemd-update-done.service    not-found  inactive  dead  systemd-update-done.service
● systemd-vconsole-setup.service not-found  inactive  dead  systemd-vconsole-setup.service

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

11 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

Список юнит-файлов

Команда list-units отображает только юниты, которые система Systemd попыталась обработать и загрузить в память. Поскольку Systemd избирательно читает только те юнит-файлы, которые кажутся ей необходимыми, список не будет включать все доступные юнит-файлы. Чтобы просмотреть список всех доступных юнит-файлов (включая те, что Systemd не пыталась загрузить), нужно использовать команду list-unit-files.

$ systemctl list-unit-files
UNIT FILE                                  STATE
----------------------------------------------------
proc-sys-fs-binfmt_misc.automount          static
-.mount                                    generated
dev-hugepages.mount                        static
....................
snapd.snap-repair.timer                    enabled
systemd-tmpfiles-clean.timer               static
ureadahead-stop.timer                      static

337 unit files listed.

Обычно столбец STATE содержит значения enabled, disabled, static или masked. В этом контексте static означает, что в юнит-файле нет раздела install, который используется для включения юнита. Таким образом, эти юниты невозможно включить. Обычно это означает, что юнит выполняет одноразовое действие или используется только как зависимость другого юнита и не должен запускаться сам по себе.

Поиск: CLI • Linux • Команда • Сервер • Служба • Сервис • Servese • Systemd • systemctl • unit • юнит • Файл

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.