Intereting Posts
В org-mode Emacs любой способ скрыть поддерево с отметкой времени, не установленной на сегодняшний день? dzen2 как определить фактическое разрешение и количество мониторов Pigz не экономит время по сравнению с обычным GZIP Самый простой способ настроить несколько поддоменов для разделения виртуальных машин на одном хосте Почему Bash возвращает «Нет такого файла ..», когда шаблон соответствует этой строке? Как отключить Nouveau на Fedora 18? Пропустить USB-устройство fastboot для VirtualBox Windows VM от ArchLinux Как grep stderr? Низкий объем от задней линии, тонкий с передней панели Файл "mv" с искаженным именем по номеру inode? Как определить влияние работающего приложения на среднюю загрузку системы из-за использования ресурсов процессора? Клавиатура не распознается после запуска сетевой менеджер не может подключиться к WPA2 Enterprise EAP Как запустить скрипт и ввести стандартный ввод в одну команду? Как я могу проверить файл, имеющий значение?

Как может быть установлен флаг systemd service, чтобы другие службы могли дождаться его готовности до их запуска?

У меня есть куча услуг (скажем, C0 , C1 , … C9 ), которые должны запускаться только после того, как служба S завершила свою инициализацию и полностью запущена и готова к другим службам. Как организовать это с помощью systemd?

При заказе сервисов с активацией пути и целью в systemd предполагается, что служба S имеет механизм для записи какого-либо файла флага. Предположим здесь, напротив, что я полностью контролирую программу, которую запускает служба S , и может добавить в нее механизмы systemd, если это необходимо.

Это не обязательно нужно.

Если службам C необходимо дождаться, когда S будет готов, чтобы они могли открыть сокет-соединение с ним, то не обязательно это делать вообще. Скорее, можно воспользоваться ранним прослушиванием сокетов, открывающимся менеджерами служб.

В нескольких системах, включая S6 , Laurent Bercot , мой набор инструментов nosh и systemd, есть способы, с помощью которых сокет для прослушивания может быть открыт на ранней стадии, самое первое, что нужно для настройки службы. Все они связаны с чем-то другим, кроме служебной программы, открывающей прослушивающий сокет (ы), а служебная программа при вызове принимает прослушивающие сокеты (ы) как уже открытые дескрипторы файлов.

С systemd, в частности, создается модуль сокета, который определяет прослушивающий сокет. systemd открывает модуль сокета и устанавливает его так, чтобы сетевая подсистема ядра слушала соединения; и передает его фактической службе в качестве дескриптора открытого файла, когда дело доходит до того, что процесс (ы), который обрабатывает (-ы) подключения к сокету. (Он может сделать это двумя способами, как и inetd , но обсуждение деталей Accept=true и Accept=false services выходит за рамки этого ответа.)

Важным моментом является то, что для этого необязательно требуется больше упорядочивания. Ядро объединяет клиентские соединения в очереди до тех пор, пока не будет инициализирована сервисная программа и не будет готова принять их и поговорить с клиентами.

Когда это делается, протоколы готовности – это вещь.

systemd имеет набор протоколов готовности, которые он понимает, указанную услугу по сервису с настройкой Type= в сервисном модуле. Здесь особый протокол готовности – это протокол notify готовности. С его помощью SystemD сообщается о ожидании сообщений от службы, и когда служба готова, она отправляет сообщение о готовности флажков. systemd задерживает активацию других сервисов до тех пор, пока не будет отмечена готовность.

Использование этого предполагает две вещи:

  • Изменение кода S так, чтобы он вызывал что-то вроде функции notify_systemd() Пьера-Ив Рицхарда или функции notify_systemd() Камерона Т. Нормана.
  • Настройка сервисного модуля для службы с помощью Type=notify NotifyAccess=main и NotifyAccess=main .

NotifyAccess=main ограничение NotifyAccess=main (которое является значением по умолчанию) связано с тем, что systemd должен знать, чтобы игнорировать сообщения от вредоносных (или просто ошибочных) программ, поскольку любой процесс в системе может отправлять сообщения в сокет уведомлений systemd.

Один использует код Пьер-Ив Рицхард или Кэмерон Т Норман для предпочтения, поскольку он не исключает возможности наличия этого механизма для UbuntuBSD, Debian FreeBSD, фактических FreeBSD, TrueOS, OpenBSD и т. Д .; который исключает код, предоставленный авторами systemd.

Одной из ловушек, которую следует избегать, является программа systemd-notify . У этого есть несколько серьезных проблем, не в последнюю очередь из того, что сообщения, отправленные вместе с ним, могут быть в конечном итоге отброшены без обработки systemd. Самая большая проблема в этом случае заключается в том, что он не запускается как «основной» процесс службы, поэтому нужно открывать уведомления о готовности для службы S для каждого процесса в системе с помощью NotifyAccess=all .

Другая ловушка, которую следует избегать, – это думать, что протокол forking проще. Это не. Правильное выполнение подразумевает не разветвление и выход из родителя до тех пор, пока, во-первых, все рабочие потоки программы не будут работать. Это не соответствует тому, как подавляющее большинство dæmons вилка фактически вилка.

дальнейшее чтение

  • Джонатан де Бойн Поллард (2015). Проблемы с протоколом готовности к работе с Unix dæmons . Часто задаваемые ответы.
  • Леннарт Поэттеринг (2010). sd_notify() . systemd. Freedesktop.org.
  • Леннарт Поэттеринг (2010). systemd-notify . systemd. Freedesktop.org.
  • Как написать файл служебного блока systemd, чтобы он до тех пор, пока не запущен какой-либо конкретный интерфейс?
  • Добавить информацию о статусе на вывод состояния systemd