Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

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

Оригинал: Managing Services on Linux with systemd
Автор: Carla Schroder
Дата публикации: 19 December 2011
Перевод: Н.Ромоданов
Дата перевода: декабрь 2014 г.

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

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

В предыдущей статье Проходим еще раз, еще один Linux Init: Введение в systemd обсуждались концепции, лежащие в основе systemd, и что этот демон должен делать. Теперь пришло время узнать, как его использовать в наших системах для управления сервисами. Механизм systemd обладает обратной совместимостью с sysvinit и с Upstart, так что вы можете попробовать его, установив его без большого количества лишних проблем в любой системе Linux, в которой же есть sysvinit или Upstart. Пакет systemd есть в репозитариях программ для систем Arch Linux, Debian и OpenSUSE.

Бросается в глаза то, что к числу дистрибутивов, в которых отсутствует systemd, относится и Ubuntu. На это есть различные причины, что меня не волнует, поскольку это мне просто не интересно. Еще один вариант, это получить копию ситемы Fedora 15 или 16, в которых механизм systemd присутствует по умолчанию.

Рис.1: systemadm для графического администрирования systemd

Хорошим графическим менеджером, с помощью которого можно управлять systemd, является пакет systemadm (рис.1). Этот менеджер разработан совсем недавно, из-за чего возможны его падения, но вы можете опробовать его, если установите пакет systemd-gtk, который есть в системе Fedora, пакет systemd-gtk в системе Arch, либо пакет systemd-gui в Debian. Нет, конечно, в различных дистрибутивах нельзя для одного пакета использовать различные имена , поскольку это против правил.

Замечательно, что есть графическое приложение systemadm, но давайте в оставшейся части статьи будем пользоваться командной строкой. В приведенных ниже примерах можно определить, когда нужны привилегии пользователя root. С помощью команды systemctl, запущенной без параметров, можно увидеть состояние всего того, чем управляет systemd:

$ systemctl
UNIT                                              LOAD   ACTIVE SUB       JOB DESCRIPTION
proc-sys-fs-binfmt_misc.automount                 loaded active waiting       Arbitrary Executable File Formats File System Aut
sys-devices-pci0...000:00:1b.0-sound-card0.device loaded active plugged       82801I (ICH9 Family) HD Audio Controller
sys-devices-pci0...-0000:05:00.0-net-wlan0.device loaded active plugged       Centrino Wireless-N 1000

Как увидеть, работают или нет доступные сервисы?

$ systemctl list-units -t service --all
UNIT              LOAD   ACTIVE   SUB   JOB   DESCRIPTION
ceph.service      loaded inactive dead        LSB: Start Ceph distributed filesystem daemons at boot time
chronyd.service   loaded active   running     NTP client/server
cman.service      error  inactive dead        cman.service

Будет выдана масса данных, вероятно, много сотен строк. Хотите увидеть только активные сервисы?

$ systemctl list-units -t service

Вы можете проверить статус любого отдельного сервиса, например, cman.service, у которого в предыдущем примере установлен флаг ошибки:

$ systemctl status cman.service
cman.service
          Loaded: error (Reason: No such file or directory)
          Active: inactive (dead)

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

$ systemctl status sshd.service
sshd.service - OpenSSH server daemon
          Loaded: loaded (/lib/systemd/system/sshd.service; enabled)
          Active: active (running) since Thu, 15 Dec 2011 12:11:05 -0800; 2h 26min ago
        Main PID: 2091 (sshd)
          CGroup: name=systemd:/system/sshd.service
                    \   2091 /usr/sbin/sshd -D

В Fedora вы все еще можете пользоваться старыми командами service и chkconfig. Но почему бы не начать изучение новых команд systemd? Например, сервис запускается следующим образом:

# systemctl start sshd.service

Или используйте команду restart для перезапуска уже запущенного сервис. Следующая команда останавливает сервис:

# systemctl stop sshd.service

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

# systemctl enable sshd.service

И это все. Не нужны никакие загрузочные скрипты. Следующая команда отменяет при загрузке запуск сервиса:

# systemctl disable sshd.service

Вы можете проверить, работает ли уже сервис; 0 означает, что в настоящее время он работает, а 1 означает, что это не так:

$ systemctl is-enabled sshd.service; echo $? 
enabled
0

Для остановки и перезагрузки системы вы можете пользоваться командами systemctl halt, poweroff и reboot. Все эти три команды отправят пользователям предупреждение о том, что система останавливается.

Процессы, cgroups и уничтожение процессов

systemd осуществляет организацию процессов при помощи групп управления cgroups, и вы можете это видеть с помощью команды ps, которая была обновлена для того, чтобы могла показывать cgroups. Для того, чтобы посмотреть, каким сервисам принадлежат какие процессы, выполните следующую команду:

$ ps xawf -eo pid,user,cgroup,args 
  PID USER     CGROUP                      COMMAND
 1338 root     name=systemd:/user/carla/2       \_ gdm-session-worker [pam/gdm-password]
 1358 carla    name=systemd:/user/carla/2           \_ /bin/sh /etc/xdg/xfce4/xinitrc
 1487 carla    name=systemd:/user/carla/2               \_ /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "startxfce4"
 1515 carla    name=systemd:/user/carla/2               \_ xscreensaver -no-splash
 1517 carla    name=systemd:/user/carla/2               \_ xfce4-session

Механизм cgroups был внедрен в ядро Linux несколько лет назад, и это интересное средство распределения и ограничения ресурсов ядра. В systemd механизм cgroups используется для запуска и управления процессами. Когда создаются новые процессы, они становятся членами родительской группы управления cgroup. Группа cgroup называется именем сервиса, к которому она принадлежит, и сервисы не могут покинуть свои группы, так что вы всегда знаете, какой сервис принадлежит к какой группе. Когда вам нужно уничтожить сервис, вы можете уничтожить его группу cgroup и одним махом добраться до всех его процессов, а не играть в игру «найди и переименуй подпроцесс». Еще один способ просмотреть иерархию процессов с помощью команды system-cgls. Это показано на рис.2.

Рис.2: Фрагмент данных, выдаваемый командой system-cgls и показывающий процессы групп управления

У меня есть мой старый друг - демон Avahi. Поэтому вместо того, чтобы по-старинке искать и уничтожать два процесса Avahi, systemd позволит мне сделать это в одной команде:

# systemctl kill avahi-daemon.service

Леннарт Поттеринг (Lennart Poettering), главный автор systemd написал для системных администраторов ряд статей. Ссылки на них приведены здесь для вашего удобства. В них описывается настройка сервисов, уровней запуска и всего, что нужно знать для того, чтобы управлять демоном systemd

Прим. ред. Поттеринг написал уже 21-ую часть своих заметок о systemd, вы найдете их все по приведенным выше ссылкам.