Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c64fc681b2 |
69
s4a.tex
69
s4a.tex
@@ -2110,6 +2110,75 @@ systemd?
|
||||
+exec+. После чего достаточно просто указать этот скрипт в опции +ExecStart=+
|
||||
вместо бинарника демона.
|
||||
|
||||
\section{Экземпляры служб}
|
||||
|
||||
Большинство служб в Linux/Unix являются одиночными (singleton): в каждый момент
|
||||
времени на данном хосте работает только один экземпляр службы. В качестве
|
||||
примера таких одиночных служб можно привести Syslogd, Postfix, Apache. Однако,
|
||||
существуют службы, запускающие по несколько экземпляров себя на одном хосте.
|
||||
Например, службы наподобие Dovecot IMAP запускают по одному экземпляру на каждый
|
||||
локальный порт и/или IP-адрес. Другой пример, который можно встретить
|
||||
практически во всех системах~--- \emph{getty}, небольшая служба, запускающаяся на
|
||||
каждом TTY (от +tty1+ до +tty6+). На некоторых серверах, в зависимости от
|
||||
сделанных администратором настроек или параметров загрузки, могут запускаться
|
||||
дополнительные экземпляры getty, для подключаемых к COM-портам терминалов или
|
||||
для консоли системы виртуализации. Еще один пример службы, работающей в
|
||||
нескольких экземплярах (по крайней мере, в мире systemd)~--- \emph{fsck},
|
||||
программа проверки файловой системы, которая запускается по одному экземпляру
|
||||
на каждое блочное устройство, требующее такой проверки. И наконец, стоит
|
||||
упомянуть службы с активацией в стиле inetd~--- через сокет, по одному
|
||||
экземпляру на каждое соединение. В этой статье я попытаюсь рассказать, как в
|
||||
systemd реализовано управление <<многоэкземплярными>> службами, и какие выгоды
|
||||
системный администратор может извлечь из этой возможности.
|
||||
|
||||
Если вы читали предыдущие статьи из этого цикла, вы, скорее всего, уже знаете,
|
||||
что службы systemd именуются по схеме \emph{foobar}+.service+, где
|
||||
\emph{foobar}~--- строка, идентифицирующая службу (проще говоря, ее имя), а
|
||||
+.service+~--- суффикс, присутствующий в именах всех файлов конфигурации служб.
|
||||
Сами эти файлы могут находиться в каталогах +/etc/systemd/systemd+ и
|
||||
+/lib/systemd/system+ (а также, возможно, и в других). Для служб, работающих в
|
||||
нескольких экземплярах, эта схема становится немного сложнее:
|
||||
\emph{foobar}+@+\emph{quux}+.service+, где \emph{foobar}~--- имя службы,
|
||||
общее для всех экземпляров, а \emph{quux}~--- идентификатор конкретного
|
||||
экземпляра. Например, +serial-gett@ttyS2.service+~--- это служба getty для
|
||||
COM-порта, запущенная на +ttyS2+.
|
||||
|
||||
При необходимости, экземпляры служб можно легко создать динамически. Скажем, вы
|
||||
можете, безо всяких дополнительных настроек, запустить новый экземпляр getty на
|
||||
последовательном порту, просто выполнив +systemctl start+ для нового экземпляра:
|
||||
\begin{Verbatim}
|
||||
# systemctl start serial-getty@ttyUSB0.service
|
||||
\end{Verbatim}
|
||||
|
||||
Получив такую команду, systemd сначала пытается найти файл конфигурации юнита с
|
||||
именем, точно соответствующим запрошенному. Если такой файл найти не~удается
|
||||
(при работе с экземплярами сервисов обычно так и происходит), из имени файла
|
||||
удаляется идентификатор экземпляра, и полученное имя используется при поиске
|
||||
\emph{шаблона} конфигурации. В нашем случае, если отсутствует файл с именем
|
||||
+serial-getty@ttyUSB0.service+, используется файл-шаблон под названием
|
||||
+serial-getty@.service+. Таким образом, для всех экземпляров данной службы,
|
||||
используется один и тот же шаблон конфигурации. В случае с getty для COM-портов,
|
||||
этот шаблон, поставляемый в комплекте с systemd
|
||||
(файл +/lib/systemd/system/serial-getty@.service+) выглядит примерно так:
|
||||
\begin{Verbatim}
|
||||
[Unit]
|
||||
Description=Serial Getty on %I
|
||||
BindTo=dev-%i.device
|
||||
After=dev-%i.device systemd-user-sessions.service
|
||||
|
||||
[Service]
|
||||
ExecStart=-/sbin/agetty -s %I 115200,38400,9600
|
||||
Restart=always
|
||||
RestartSec=0
|
||||
\end{Verbatim}
|
||||
(Заметим, что приведенная здесь версия немного сокращена, по сравнению с реально
|
||||
используемой в systemd. Удалены не~относящиеся к теме нашего обсуждения
|
||||
параметры конфигурации, обеспечивающие совместимость с SysV, очистку экрана и
|
||||
удаление предыдущих пользователей с текущего TTY. Если вам интересно, можете
|
||||
посмотреть
|
||||
\href{http://cgit.freedesktop.org/systemd/plain/units/serial-getty@.service.m4}{полную
|
||||
версию}.)
|
||||
|
||||
\end{document}
|
||||
|
||||
vim:ft=tex:tw=80:spell:spelllang=ru
|
||||
|
||||
Reference in New Issue
Block a user