diff --git a/s4a.tex b/s4a.tex index 139c029..655dee8 100644 --- a/s4a.tex +++ b/s4a.tex @@ -836,7 +836,7 @@ systemd запустит процесс abrtd, который уже не~буд падения. Или, например, добавив +OOMScoreAdjust=-500+, мы попросим ядро сберечь эту службу, даже если OOM Killer выйдет на тропу войны. А если мы добавим строчку +CPUSchedulingPolicy=idle+, процесс abrtd будет работать только в те -моменты, когда система больше ничем не~занята, что позволит не создавать помех +моменты, когда система больше ничем не~занята, что позволит не~создавать помех для процессов, активно использующих CPU. За более подробным описанием всех опций настройки, вы можете обратиться к @@ -859,7 +859,7 @@ service-файлы. Но, к счастью, <<проблемных>> скрип Впрочем, этот метод не~вполне корректен, так как он действует не~только на самого демона, но и на другие процессы с тем же именем. Иногда подобное поведение может привести к неприятным последствиям. Более правильным будет -использование pid-файла: +kill $(cat /var/run/syslogd.pid)+. Вот, вроде +использование pid-файла: +kill $(cat /var/run/syslogd.pid)$+. Вот, вроде бы, и все, что вам нужно\ldots{} Или мы упускаем еще что-то? Действительно, мы забываем одну простую вещь: существуют службы, такие, как @@ -946,4 +946,158 @@ systemd и на этот случай есть простое решение, и инструментов, позволяющих корректно отправить сигнал службе в целом, а не~отдельному процессу. +\section{Три уровня выключения} + +В \href{http://www.freedesktop.org/wiki/Software/systemd}{systemd} существует +три уровня (разновидности) действий, направленных на прекращение работы службы +(или любого другого юнита): + +\begin{itemize} + \fvset{gobble=3} + \item Вы можете \emph{остановить} службу, то есть прекратить + выполнение уже запущенных процессов службы. При этом + сохраняется возможность ее последующего запуска, как ручного + (через команду +systemctl start+), так и автоматического (при + загрузке системы, при поступлении запроса через сокет или + системную шину, при срабатывании таймера, при подключении + соответствующего оборудования и т.д.). Таким образом, + остановка службы является временной мерой, не~дающей никаких + гарантий на будущее. + + В качестве примера рассмотрим остановку службы NTPd + (отвечающей за синхронизацию времени по сети): + \begin{Verbatim} + systemctl stop ntpd.service + \end{Verbatim} + + Аналогом этой команды в классическом SysV init является + \begin{Verbatim} + service ntpd stop + \end{Verbatim} + + Заметим, что в Fedora~15, использующей в качестве системы + инициализации systemd, в целях обеспечения обратной + совместимости допускается использование классических + SysV-команд, и systemd будет корректно воспринимать их. + В~частности, вторая приведенная здесь команда будет эквивалентна + первой. + + \item Вы можете \emph{отключить} службу, то есть отсоединить ее от всех + триггеров активации. В результате служба уже не~будет + автоматически запускаться ни~при загрузке системы, ни~при + обращении к сокету или адресу на шине, ни~при подключении + оборудования, и т.д. Но при этом сохраняется возможность + <<ручного>> запуска службы (командой +systemctl start+). + Обратите внимание, что при отключении уже запущенной службы, ее + выполнение в текущем сеансе не~останавливается~--- это нужно + сделать отдельно, иначе процессы службы будут работать до + момента выключения системы (но при следующем включении, + разумеется, уже не~запустятся). + + Рассмотрим отключение службы на примере все того же NTPd: + \begin{Verbatim} + systemctl disable ntpd.service + \end{Verbatim} + + В классических SysV-системах аналогичная команда будет иметь + вид + \begin{Verbatim} + chkconfig ntpd off + \end{Verbatim} + + Как и в предыдущем случае, в Fedora~15 вторая из этих команд + будет действовать аналогично первой. + + Довольно часто приходится сочетать действия отключения и + остановки службы~--- такая комбинированная операция + гарантирует, что уже исполняющиеся процессы службы будут + прекращены, и служба больше не~будет запускаться автоматически + (но может быть запущена вручную): + \begin{Verbatim} + systemctl disable ntpd.service + systemctl stop ntpd.service + \end{Verbatim} + Подобное сочетание команд используется, + например, при деинсталляции пакетов в Fedora. + + Обратите внимание, что отключение службы является перманентной + мерой, и действует вплоть до явной отмены соответствующей + командой. Перезагрузка системы не~отменяет отключения службы. + + \item Вы можете \emph{заблокировать} (замаскировать) службу. Действие + этой операции аналогично отключению, но дает более сильный + эффект. Если при отключении отменяется только возможность + автоматического запуска службы, но сохраняется возможность + ручного запуска, то при блокировке исключаются обе эти + возможности. Отметим, что использование данной опции при + непонимании принципов ее работы может привести к трудно + диагностируемым ошибкам. + + Тем не~менее, рассмотрим пример блокировки все той же службы NTPd: + \begin{Verbatim} + ln -s /dev/null /etc/systemd/system/ntpd.service + systemctl daemon-reload + \end{Verbatim} + + Итак, блокировка сводится к созданию символьной ссылки + с именем соответствующей службы, указывающей на +/dev/null+. + После такой операции служба не~может быть запущена ни~вручную, + ни~автоматически. Символьная ссылка создается в каталоге + +/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-скрипта. Однако, подобные решения + имеют ряд недостатков, например, потенциальная возможность + конфликтов с пакетным менеджером (при очередном обновлении + исправленный скрипт может быть просто затерт соответствующим + файлом из пакета). + + Стоит отметить, что блокировка службы, как и ее отключение, + является перманентной мерой\footnote{Прим. перев.: подробно + описав принцип работы блокировки службы (юнита), автор забывает + привести практические примеры ситуаций, когда эта возможность + оказывается полезной. + + В частности, иногда бывает необходимо + полностью предотвратить запуск службы в любой ситуации. При этом + не~стоит забывать, что в post-install скриптах пакетного + менеджера или, скажем, в~заданиях cron, вместо + +systemctl try-restart+ (+service condrestart+) может быть + ошибочно указано +systemctl restart+ (+service restart+), что + является прямым указанием на запуск службы, если она еще + не~запущена. Вследствие таких ошибок, отключенная служба может + <<ожить>> в самый неподходящий момент. + + Другой пример~--- + ограничение возможностей непривилегированного пользователя при + управлении системой. Даже если такому пользователю делегировано + (через механизмы sudo или PolicyKit) право на использование + +systemctl+, это еще не~означает, что он сможет запустить + заблокированную службу~--- права на выполнение +rm+ (удаление + блокирующей символьной ссылки) выдаются отдельно}. +\end{itemize} + +После прочтения изложенного выше, у читателя может возникнуть вопрос: как +отменить произведенные изменения? Что ж, ничего сложного тут нет: ++systemctl start+ отменяет действия +systemctl stop+, +systemctl enable+ +отменяет действие +systemctl disable+, а +rm+ отменяет действие +ln+. + \end{document} + +vim:ft=tex:tw=80:spell:spelllang=ru