5. Три уровня выключения

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

* Вы можете остановить службу, то есть прекратить выполнение уже запущенных процессов службы. При этом сохраняется возможность ее последующего запуска, как ручного (через команду systemctl start), так и автоматического (при загрузке системы, при поступлении запроса через сокет или системную шину, при срабатывании таймера, при подключении соответствующего оборудования и т.д.).
Таким образом, остановка службы является временной мерой, не дающей никаких гарантий на будущее.
В качестве примера рассмотрим остановку службы NTPd, отвечающей за синхронизацию времени по сети:


systemctl stop ntpd.service


Аналогом этой команды в классическом SysV init является


service ntpd stop


Заметим, что в Fedora 15, использующей в качестве системы инициализации systemd, в целях обеспечения обратной совместимости допускается использование классических SysV-команд, и systemd будет корректно воспринимать их. В частности, вторая приведенная здесь команда будет эквивалентна первой.

* Вы можете отключить службу, то есть отсоединить ее от всех триггеров активации. В результате служба уже не будет автоматически запускаться ни при загрузке системы, ни при обращении к сокету или адресу на шине, ни при подключении оборудования, и т.д. Но при этом сохраняется возможность «ручного» запуска службы командой systemctl start. Обратите внимание, что при отключении уже запущенной службы, ее выполнение в текущем сеансе не останавливается — это нужно сделать отдельно, иначе процессы службы будут работать до момента выключения системы (но при следующем включении, разумеется, уже не запустятся).
Рассмотрим отключение службы на примере все того же NTPd:


systemctl disable ntpd.service


В классических SysV-системах аналогичная команда будет иметь вид


chkconfig ntpd off


Как и в предыдущем случае, в Fedora 15 вторая из этих команд будет действовать аналогично первой.
Довольно часто приходится сочетать действия отключения и остановки службы — такая комбинированная операция гарантирует, что уже исполняющиеся процессы службы будут прекращены, и служба больше не будет запускаться автоматически (но может быть запущена вручную):


systemctl disable ntpd.service
systemctl stop ntpd.service


Подобное сочетание команд используется, например, при деинсталляции пакетов в Fedora. Обратите внимание, что отключение службы является перманентной мерой, и действует вплоть до явной отмены соответствующей командой. Перезагрузка системы не отменяет отключения службы.

* Вы можете заблокировать (замаскировать) службу. Действие этой операции аналогично отключению, но дает более сильный эффект. Если при отключении отменяется только возможность автоматического запуска службы, но сохраняется возможность ручного запуска, то при блокировке исключаются обе эти возможности. Отметим, что использование данной опции при непонимании принципов ее работы может привести к трудно диагностируемым ошибкам.
Тем не менее, рассмотрим пример блокировки все той же службы NTPd:


ln -s /dev/null /etc/systemd/system/ntpd.service
systemctl daemon-reload


Итак, блокировка сводится к созданию символьной ссылки с именем соответствующей службы, указывающей на /dev/null.
Прим. перев.: Впоследствии в программу systemctl была добавлена поддержка команд mask и unmask, упрощающих процесс блокирования и разблокирования юнитов. Например, для блокирования службы ntpd.service теперь достаточно команды systemctl mask ntpd.service. Фактически она сделает то же самое, что и приведенная выше команда ln.
После такой операции служба не может быть запущена ни вручную, ни автоматически. Символьная ссылка создается в каталоге /etc/systemd/system/, а ее имя должно соответствовать имени файла описания службы из каталога /lib/systemd/system/ (в нашем случае ntpd.service).

Заметим, что systemd читает файлы конфигурации из обоих этих каталогов, но файлы из /etc (управляемые системным администратором) имеют
приоритет над файлами из /lib (которые управляются пакетным менеджером). Таким образом, создание символьной ссылки (или обычного файла)
/etc/systemd/system/ntpd.service предотвращает чтение штатного файла конфигурации /lib/systemd/system/ntpd.service.
В выводе systemctl status заблокированные службы отмечаются словом masked. Попытка запустить такие службы командой systemctl start завершится ошибкой.
В рамках классического SysV init, штатная реализация такой возможности отсутствует. Похожий эффект может быть достигнут с помощью «костылей», например, путем добавления команды exit 0 в начало init-скрипта. Однако, подобные решения имеют ряд недостатков, например, потенциальная возможность конфликтов с пакетным менеджером (при очередном обновлении исправленный скрипт может быть просто затерт соответствующим файлом из пакета).

Стоит отметить, что блокировка службы, как и ее отключение, является перманентной мерой.
Прим. перев.: Подробно описав принцип работы блокировки службы (юнита), автор забывает привести практические примеры ситуаций, когда эта возможность оказывается полезной. В частности, иногда бывает необходимо полностью предотвратить запуск службы в любой ситуации. При этом не стоит забывать, что в post-install скриптах пакетного менеджера или, скажем, в заданиях cron, вместо systemctl try-restart (service condrestart) может быть ошибочно указано systemctl restart (service restart), что является прямым указанием на запуск службы, если она еще не запущена. Вследствие таких ошибок, отключенная служба может «ожить» в самый неподходящий момент.

После прочтения изложенного выше, у читателя может возникнуть вопрос: как отменить произведенные изменения? Что ж, ничего сложного тут нет: systemctl start отменяет действия systemctl stop, systemctl enable отменяет действие systemctl disable, а rm отменяет действие ln.

Содержание
Вперед - Смена корня
Назад - Убить демона