MyTetra Share
Делитесь знаниями!
10.2 Управление системными сервисами
Время создания: 10.04.2024 11:17
Текстовые метки: linux, systemd, сервис, управление
Раздел: Компьютер - Linux - Управление сервисами (демонами) - Документация RedHat по systemd
Запись: xintrea/mytetra_syncro/master/base/1712737065fhjk75cx5z/text.html на raw.github.com

10.2 Управление системными сервисами

Предыдущие версии RHEL, которые поставлялись с системой инициализации SysV или Upstart, использовали скрипты инициализации, расположенные в директории/etc/rc.d/init.d/. Эти скрипты как правило были написаны на Bash и позволяли системному администратору контролировать состояние служб и демонов в системе. В Red Hat Enterprise Linux 7 эти скрипты были заменены сервисными юнитами.

Сервисные юниты имеют расширение .service (прим.пер. – в этом разделе мы будем говорить именно про эти сервисы)и делают то же, что делали init-скрипты. Чтобы просмотреть, запустить, остановить, перезапустить, включить или отключить системные службы, используйте команду systemctl, как описано в Таблице 10.3,”Сравнение утилиты service с systemd” и Таблице 10.4, “Сравнение утилиты chkconfig с systemctl”, а также далее в этом разделе. Команды service и chkconfig по прежнему доступны в системе и работают как ожидалось, но включены в системе только по соображениям совместимости и их следует избегать (прим.пер. – хотя бы потому, что юниты systemd все равно имеют больший приоритет).


Таблица 10.3. Сравнение утилиты service с systemd



service

systemctl

Описание


service name start


systemctl start name.service


Запуск сервиса


service name stop


systemctl stop name.service


Остановка сервиса


service name restart


systemctl restart name.service


Рестарт сервиса


service name condrestart


systemctl try-restart name.service


Рестарт сервиса только если он запущен


service name reload


systemctl reload name.service


Перезагрузка конфигурации


service name status


systemctl status name.service

systemctl is-active name.service


Проверяет запущен ли сервис


service –status-all

systemctl list-units –type service –all

Отображает статус всех сервисов


Таблица 10.4, Сравнение утилиты chkconfig с systemctl



chkconfig


systemctl


Description


chkconfig name on


systemctl enable name.service


Включает сервис в автозагрузку


chkconfig name off


systemctl disable name.service


Удаляет сервис из автозагрузки


chkconfig –list name


systemctl status name.service

systemctl is-enabled name.service


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

chkconfig –list


systemctl list-unit-files –type service


Выводит список всех сервисов

и проверяет активированы ли они


chkconfig –list


systemctl list-dependencies –after


Просмотр списка сервисов,

которые должны запускаться

до указанного юнита


chkconfig –list


systemctl list-dependencies –before


Просмотр списка сервисов,

которые должны запускаться

после указанного юнита


Определение сервисных юнитов

Для ясности все примеры команд в этом разделе содержат полное имя юнита с расширением .service, например:


~]# systemctl stop nfs-server.service


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


~]# systemctl stop nfs-server


Кроме того, некоторые юниты имеют алиасы. Они могут быть короче, чем имя юнита и могут быть использованы вместо имени юнита. Чтобы найти все алиасы для определенного юнита, используйте команду:


~]# systemctl show nfs-server.service -p Names



Поведение systemctl в среде chroot

Если вы смените корневой каталог с помощью команды chroot, многие команды systemctl перестанут выполняться. Причина в том, что systemd и пользователь, который выполнил chroot имеют не одинаковое представление о файловой системе. Такое случается, например, при вызове systemctl из файла kickstart.

Исключением являются команды systemctl enable и systemctl disable. Этим командам не нужна запущенная система и они не влияют на запущенные процессы, но влияют на файлы юнитов. Поэтому вы можете запускать эти команды даже в chroot. Например, добавим в автозагрузку сервис httpd в каталоге /srv/website1/:


~]# chroot /srv/website1

~]# systemctl enable httpd.service

Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service, pointing to /usr/lib/systemd/system/httpd.service.



10.2.1. Списки сервисов

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


systemctl list-units --type service


Для каждого юнит-файла эта команда отображает полное имя (UNIT), за ним следует примечание, загружен ли файл юнита (LOAD), высокоуровневый (ACTIVE) и низкоуровневый (SUB) статус юнита, и краткое описание (DESCRIPTION). По умолчанию команда systemctl list-units отображает только активные юниты. Если вы хотите просмотреть все загруженные юниты независимо от их статуса, запустите эту команду с опцией –all или -a:


systemctl list-units --type service --all


Вы так же можете просмотреть все доступные юниты сервисов, чтобы проверить включены ли они в автозагрузку:


systemctl list-unit-files --type service


Для каждого сервисного юнита эта команда отображает полное имя (UNIT FILE) и информацию о том, активирован ли юнит (STATE). Информацию о том, как определить статус отдельных сервисов, см. в разделе 10.2.2 “Отображение статуса сервиса”.


Пример 10.1. Списки сервисов

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


~]$ systemctl list-units --type service

UNIT LOAD ACTIVE SUB DESCRIPTION

abrt-ccpp.service loaded active exited Install ABRT coredump hook

abrt-oops.service loaded active running ABRT kernel log watcher

abrt-vmcore.service loaded active exited Harvest vmcores for ABRT

abrt-xorg.service loaded active running ABRT Xorg log watcher

abrtd.service loaded active running ABRT Automated Bug Reporting Tool

...

systemd-vconsole-setup.service loaded active exited Setup Virtual Console

tog-pegasus.service loaded active running OpenPegasus CIM Server

 

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.

 

46 loaded units listed. Pass --all to see loaded but inactive units, too.

To show all installed unit files use 'systemctl list-unit-files'


Список установленных сервисов, показывающий включены ли они в автозагрузку:


~]$ systemctl list-unit-files --type service

UNIT FILE STATE

abrt-ccpp.service enabled

abrt-oops.service enabled

abrt-vmcore.service enabled

abrt-xorg.service enabled

abrtd.service enabled

...

wpa_supplicant.service disabled

ypbind.service disabled

 

208 unit files listed.



10.2.2. Отображение статуса сервиса

Чтобы отобразить подробную информацию о юните сервиса, соответствующему системному сервису, введите следующую команду:


systemctl status name.service


Замените name на имя юнита сервиса, который вы хотите проверить (например, gdm). Эта команда отобразит имя выбранного юнита, затем краткое описание, одно или несколько полей из описанных в Таблице 10.5, “Доступная информация о юнитах сервисов”. А если вы выполните команду под пользователем root, то также увидите последние записи из лога.


Таблица 10.5. Доступная информация о юнитах сервисов



Поле


Описание


Loaded


Информация о том, загружен ли юнит сервиса,

абсолютный путь к файлу юнита,

включен ли юнит в автозагрузку


Active


Информация о том, запущен ли юнит сервиса и отметка о времени


Main PID


PID соответствующей системной службы и далее ее имя.


Status


Дополнительная информация о соответствующем системном сервисе.


Process


Дополнительная информация о связанных процессах.


CGroup

Дополнительная информация о связанных контрольных группах (cgroups).


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


systemctl is-active name.service


Аналогично, чтобы определить активирован ли определенный юнит сервиса, введите:


systemctl is-enabled name.service


Обратите внимание, что systemctl is-active и systemctl is-enabled возвращают статус 0 если данный юнит сервиса запущен или включен в автозагрузку. Информацию о том, как просмотреть все загруженные юниты сервисов см. в разделе 10.2.1. Списки сервисов.


Пример 10.2. Отображение статуса сервиса

Юнит сервиса для GNOME Display Manager называется gdm.service. Чтобы определить текущий статус этого сервиса, введите следующую команду:


~]# systemctl status gdm.service

gdm.service - GNOME Display Manager

Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)

Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago

Main PID: 1029 (gdm)

CGroup: /system.slice/gdm.service

├─1029 /usr/sbin/gdm

├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...

└─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...

 

Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.


Пример 10.3. Отображение сервисов, которые запускаются до старта выбранного сервиса

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


~]# systemctl list-dependencies --after gdm.service

gdm.service

├─dbus.socket

├─getty@tty1.service

├─livesys.service

├─plymouth-quit.service

├─system.slice

├─systemd-journald.socket

├─systemd-user-sessions.service

└─basic.target

[output truncated]


Пример 10.4. Отображение сервисов, которые запускаются после старта выбранного сервиса

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


~]# systemctl list-dependencies --before gdm.service

gdm.service

├─dracut-shutdown.service

├─graphical.target

│ ├─systemd-readahead-done.service

│ ├─systemd-readahead-done.timer

│ └─systemd-update-utmp-runlevel.service

└─shutdown.target

├─systemd-reboot.service

└─final.target

└─systemd-reboot.service


10.2.3. Запуск сервиса

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


systemctl start name.service


Замените name именем сервиса, который вы хотите запустить (например, gdm). Эта команда запустит выбранный сервис в текущей сессии. Как включить юнит в автозагрузку см. в Разделе 10.2.6, “Включение сервиса в автозагрузку”. Как определить статус юнита см. в Разделе 10.2.2, “Отображение статуса сервиса”.


Пример 10.5. Запуск сервиса

Юнит сервиса Apache HTTP Server имеет имя httpd.service. Чтобы запустить демон httpd в текущей сессии, выполните следующую команду от root:


~]# systemctl start httpd.service



10.2.4. Остановка сервиса

Чтобы остановить юнит сервиса и соответствующий системный сервис, введите следующую команду от root:


systemctl stop name.service


Замените name на имя сервиса, который вы хотите остановить (например, bluetooth). Эта команда останавливает выбранный юнит сервиса в текущей сессии. О том как отключить запуск юнита при старте системы см. в Разделе 10.2.7 “Удаление сервиса из автозагрузки”. Как определить статус юнита см. в Разделе 10.2.2 “Отображение статуса сервиса”.

Пример 10.6. Остановка сервиса

Сервисный юнит для демона bluetoothd имеет имя bluetooth.service. Чтобы оставновить демон bluetoothd в текущей сессии, введите следующую команду от root:


~]# systemctl stop bluetooth.service



10.2.5. Перезапуск сервиса

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


systemctl restart name.service


Замените name на имя сервиса, который вы хотите перезапустить (например, httpd). Эта команда остановит выбранный сервис и сразу запустит его снова. Если выбранный сервис не запущен, то эта команда запустит его. Чтобы systemd перезапустила сервис только в том случае, если он уже запущен, выполните следующую команду от root:


systemctl try-restart name.service


Некоторые сервисы позволяют перезагрузить конфигурацию без прерывания их выполнения. Для этого выполните от root:


systemctl reload name.service


Обратите внимание, что системные сервисы, которые не поддерживают эту функцию, полностью игнорируют эту команду. Для удобства команда systemctl также поддерживает команды reload-or-restart и reload-or-try-restart, которые перезапускают такие службы. Как определить статус юнита см. в Разделе 10.2.2 “Отображение статуса сервиса”.


Пример 10.7. Перезапуск сервиса

Чтобы пользователи не сталкивались с ненужными сообщениями об ошибках или частично отображаемыми веб-страницами, HTTP-сервер Apache позволяет редактировать и перезагружать конфигурацию без перезапуска сервера и прерывания активно обрабатываемых запросов. Для перезагрузки конфигурации введите от root следующую команду:


~]# systemctl reload httpd.service



10.2.6. Включение сервиса в автозагрузку

Чтобы юнит сервиса и соответствующий ему сервис автоматически стартовали при загрузке системы, введите от root следующую команду:


systemctl enable name.service


Замените name на имя сервиса, который вы хотите включить в автозагрузку (например, httpd). Эта команда считывает раздел [Install] выбранного юнита и создает соответствующие символические ссылки (далее – симлинки) на файл /usr/lib/systemd/system/name.service из директории /etc/systemd/system/ и его поддиректорий. Однако, эта команда не перезаписывает уже существующие симлинки. Если вы хотите заново создать симлинки, используйте следующую команду от root:


systemctl reenable name.service


Эта команда убирает юнит из автозагрузки и тут же добавляет его снова. Чтобы получить информацию о том, включен ли юнит в автозагрузку см. в Разделе 10.2.2, “Отображение статуса сервиса”. Как запустить сервис в текущей сессии см. в Разделе 10.2.3,”Запуск сервиса”.


Пример 10.8. Включение сервиса в автозагрузку

Чтобы включить Apache HTTP Server в автозагрузку, введите следующую команду от root:


~]# systemctl enable httpd.service

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.



10.2.7. Удаление из автозагрузки

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


systemctl disable name.service


Замените name на имя сервиса, который вы хотите отключить (например, bluetooth). Эта команда считывает раздел [Install] выбранного юнита и удалаяет соответствующий симлинк на файл /usr/lib/systemd/system/name.service из директории /etc/systemd/system/ и ее поддиректорий. Также. вы можете замаскировать юнит для предотвращения его запуска вручную или другим сервисом. Для этого выполните от root следующую команду:


systemctl mask name.service


Эта команда заменит файл /etc/systemd/system/name.service симлинком на /dev/null, что сделает сервис фактически недоступным для systemd. Чтобы отменить это действие, выполните от root:


systemctl unmask name.service


Чтобы получить информацию о том, включен ли юнит в автозагрузку см. Раздел 10.2.2, “Отображение статуса сервиса”. Как остановить юнит в текущей сессии см. в Разделе 10.2.4, “Остановка сервиса”.



Пример 10.9. Удаление из автозагрузки

Пример 10.6, “Остановка сервиса” показывает как остановить сервис в текущей сессии. Чтобы предотвратить запуск сервиса во время загрузки, наберите следующую команду от root:


~]# systemctl disable bluetooth.service

Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.

Removed symlink /etc/systemd/system/dbus-org.bluez.service.



10.2.8. Запуск конфликтующего сервиса

В systemd существуют положительные и отрицательные зависимости между сервисами. Для запуска сервиса может потребоваться запуск (положительная зависимость) или остановка (отрицательная зависимость) других сервисов.

Когда вы пытаетесь запустить сервис, systemd автоматически разрешает все зависимости. Обратите внимание, что это делается без явного уведомления пользователя. Если вы запустили сервис, а потом пытаетесь запустить сервис с отрицательной зависимостью, первый сервис будет автоматически остановлен.

Например, если вы запускаете сервис postfix, а потом пробуете запустить sendmail, systemd сначала остановит postfix, потому что эти сервисы конфликтуют и не могут работать на одном и том же порту одновременно.


 
MyTetra Share v.0.59
Яндекс индекс цитирования