Библиотека сайта 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
- Переосмысливаем PID 1
- systemd для администраторов, часть I
- systemd для администраторов, часть II
- systemd для администраторов, часть III
- systemd для администраторов, часть IV
- systemd для администраторов, часть V
- systemd для администраторов, часть VI
- systemd для администраторов, часть VII
- systemd для администраторов, часть VIII
- systemd для администраторов, часть IX
- systemd для администраторов, часть X
- systemd для администраторов, часть XI
Прим. ред. Поттеринг написал уже 21-ую часть своих заметок о systemd, вы найдете их все по приведенным выше ссылкам.