systemd разветвляется против простого?


24

Я пишу свой первый systemdфайл модуля.

Для Type, есть несколько вариантов: forking, simple, и т.д. Я прочитал Redhat документа по этой теме (таблица 9.9), но до сих пор не уверен , когда я должен использовать какой вариант.

Какие-нибудь рекомендации?

Ответы:


46

Что произойдет, когда вы запустите службу вручную из командной строки (без использования команды nohupпрефикса или &суффикса для запуска в фоновом режиме или, другими словами, просто запустите команду, которую вы поместите в ExecStart=строку .serviceфайла)?

a) Если служба запускается и продолжает работать, а приглашение не возвращается, пока вы не нажмете Control-C или не остановите службу каким-либо другим способом: тогда Type = simpleэто правильный выбор.

б) Если приглашение возвращается, но служба продолжает работать в фоновом режиме (т. е. служба самостоятельно демонтируется), тогда Type = forkingэто правильный выбор.

c) Если служба выполняет свою работу и возвращается к приглашению, не оставляя ничего запущенного (т. е. служба просто настраивает некоторые параметры ядра, отправляет команду чему-то другому или делает что-то подобное), то Type = oneshot, вероятно, это правильный выбор. В этом случае ExecStartслужбы может быть команда «установить» что-то, и ExecStopбудет соответствующей командой «сбросить» это. Этот тип обычно имеет преимущество RemainAfterExit=true, поэтому systemd будет отслеживать «состояние» этой службы в зависимости от того, была ли эта вещь недавно «установлена» или «не установлена».

Другие Typeзначения являются особыми случаями. Например, если служба использует соединение по шине D-Bus, то Type = dbusможет быть лучшим выбором. Он systemdосознает этот факт, и затем systemd будет отслеживать этот сервис (и все, что от него зависит) по наличию этого сервиса на D-Bus.

Для использования Type = notifyпроцесс должен иметь возможность подключаться к сокету Unix, указанному в переменной среды, $NOTIFY_SOCKETи сообщать о своем состоянии, записывая сообщения в этот сокет при необходимости. Кроме того, в служебном файле должна быть указана NotifyAccessопция предоставления доступа к сокету уведомлений в зависимости от ситуации.

Существует утилита командной строки systemd-notifyи функция библиотеки C, которую sd_notify(3)вы можете использовать для отправки этих сообщений, но если ни одно из них не соответствует вашим требованиям, вы можете просто внедрить своего собственного отправителя сообщения. Требуемые сообщения очень просты и выглядят как назначения переменных оболочки: например, для уведомления о том, что служба успешно завершила запуск и готова обслуживать любые входящие запросы, служба должна отправить строку, эквивалентную выводу, printf "READY=1\n"в сокет. Смотрите man 3 sd_notifyболее подробную информацию о распознанных сообщениях.

Примечание: многие приложения-службы, разработанные для переносимости на многие системы в стиле Unix, могут вести себя как b) по умолчанию, но их можно заставить работать как a), добавив параметр (обычно описываемый как «не форкать», «продолжайте работать»). на переднем плане "," не демонизировать "или подобное). В этом случае, если у опции нет других побочных эффектов, для нее предпочтительнее добавить опцию и использовать поведение a) -типа systemd.


Предположим, я начинаю apache, какой тип должен использоваться?
Kittygirl

2
Ну, как бы вы запустили это вручную? Работая apachectl startот имени root, возможно? Попробуйте сделать это и посмотрите, что получится. Затем выберите a), b) или c) из моего ответа. Могу поспорить, что подсказка вернется и Apache останется запущенным, так что б) будет ответом.
telcoM

Мне очень нравятся объяснения, которые вы дали в своем ответе. Не могли бы вы добавить еще одно простое английское объяснение случая Type=notify?
Янки

Описание Type=notifyдобавлено.
Телеком
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.