Что произойдет, когда вы запустите службу вручную из командной строки (без использования команды 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
, какой тип должен использоваться?apachectl start
от имени root, возможно? Попробуйте сделать это и посмотрите, что получится. Затем выберите a), b) или c) из моего ответа. Могу поспорить, что подсказка вернется и Apache останется запущенным, так что б) будет ответом.Type=notify
?Type=notify
добавлено.