Intereting Posts
«Lshw -C disk» возвращается, но ничего не печатает yast2 разбился в момент загрузки программного модуля установки Смешивание локальных и удаленных папок IMAP в Neo / Mutt и iSync? Найти, когда файл был закрыт в Unix не удалось установить что-либо с помощью apt-get из-за insserv Как перезапустить скрипт python через одну секунду с помощью UPSTART? Возможно ли смоделировать установку пакетов Debian, по-прежнему маркируя их установленными? Как ACL вычисляет эффективные разрешения для файла? Заменить требуемые утверждения автозагрузкой в ​​файле .emacs для повышения производительности Почему grub2-install escape chroot jail? Установка максимального объема Arch Linux не загружается: ошибка: нет такого устройства Linux Mint 15 не спящий режим btrfs на SD-карте, что означает «Btrfs обнаружены SSD-устройства, которые поддерживают режим SSD»? Как запустить трубу в качестве постоянного процесса

Как может быть установлен флаг 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