Я сделал * .deb со службой:
[Unit]
Description=Hello example service
Wants=nginx
[Service]
Type=simple
ExecStart=/usr/local/bin/hello
TimeoutStopSec=15
Restart=always
postinst
(не влияет ни на что, кроме как дает ошибку во время установки, если используется: update-rc.d: error: initscript does not exist: /etc/init.d/hello
):
update-rc.d hello defaults
invoke-rc.d nginx reload
prerm
Сценарий Debian для него:
invoke-rc.d hello stop
Этот скрипт не останавливает службу. Он не работает, даже если запущен вручную. Возвращает 102 каждый раз.
systemctl stop
отлично работает для моего сервиса.
Каким-то образом invoke-rc.d
работает для веб-сервера:
sudo invoke-rc.d nginx stop
Что происходит?
invoke-rc.d
команда является для sysv init сценариями (как в его странице справочника говорится), не Выскочка или systemd. Nginx все еще имеет sysv init, сценарий (искать init.d
в списке файлов), который является, вероятно, почему invoke-rc.d
работы для него (или кажется, так или иначе).
Даже при том, что руководства Debian используют invoke-rc.d
, на Ubuntu предпочтите использовать service
команда. Это - сценарий обертки, который может обработать sysv init, Выскочку и systemd файлы.
systemd документация рекомендует использовать service
также:
Если Ваше распределение удаляет сценарии SysV init в пользу systemd ввода файлов единицы
/etc/init.d/foobar start
запустить сервис не будет работать, так как сценарий не будет доступен. Используйте более корректное/sbin/service foobar start
вместо этого, и Ваша команда будет направлена к systemd. Обратите внимание, что вызов init сценария непосредственно всегда был субоптимальным, так как слишком много контекста выполнения вызывающей стороны (блок среды, umask, пределы ресурса, журналы аудита...) закончило тем, что было наследовано обслуживанием и вызовом через/sbin/service
используемый для чистки этого по крайней мере частично. Вызов через/sbin/service работает и над SysV и над systemd системами. Кроме того, LSB только стандартизирует вызов через/sbin/service
так или иначе. (Обратите внимание, что некоторые дистрибутивы поставляют и systemd файлы единицы и сценарии SysV для сервисов. Поскольку они вызывающие init сценарии будут работать как ожидалось и запрос быть переданными systemd в любом случае.)
Конечно, для Ubuntu, service
расположен в /usr/sbin/service
.