Как правильно перезапустить зависимые службы при установке пакета?

10

Я создаю пакет конфигурации и хотел бы остановить и перезапустить службы, конфигурация которых затронута. Прямо сейчас я использую service [stop|restart]в {pre,post}{inst,rm}пути. Я где-то прочитал вопрос, который invoke-rc.dявляется правильным , потому что он учитывает предпочтения пользователя в отношении услуги. Тем не менее, я не мог найти какие-либо рекомендации по этому поводу. Кто-нибудь знает такие рекомендации? Или есть какой-нибудь совет относительно того, какой путь мне выбрать? Пакет предназначен для внутреннего использования и, скорее всего, будет только 14.04 в течение следующих двух лет. Тем не менее, я хотел бы оставить как можно более чистое состояние для моего преемника, так же systemdкак и в моей голове.

Со invoke-rc.dстраницы руководства :

Весь доступ к сценариям инициализации с помощью сценариев сопровождающих пакетов Debian должен осуществляться через invoke-rc.d .

Из Руководства по политике Debian, глава 9, раздел 3.3 :

Сопровождающие должны использовать уровень абстракции, предоставляемый программами update-rc.d и invoke-rc.d, для работы с initscripts в сценариях своих пакетов, таких как postinst, prerm и postrm.

...

Сценарии сопровождающего пакета должны использовать invoke-rc.d для вызова initscripts /etc/init.d/*, а не вызывать их напрямую.

Debian использует sysv-initи перейдет непосредственно к systemd, и я полагаю, что руководство по политике будет своевременно обновлено для ссылки systemctl. Однако, в чем я не уверен, так это в следующем: я должен использовать invoke-rc.dвместо service? Я могу сказать, dpkgчто меня интересуют некоторые файлы (с помощью триггеров), так есть ли способ сказать, dpkgчто я также заинтересован в некоторых службах и dpkgвыполнить перезагрузку / перезагрузку?

Чтобы уточнить: я не пишу сценарии инициализации. Я предоставляю пакет с конфигурацией для других приложений, таких как Puppet, NTP и т. Д., Поэтому я останавливаю и перезапускаю соответствующие службы в сценариях.

Вот , например, проблема Docker о invoke-rc.dпротив service. Вопрос по-прежнему открыт, один человек, вероятно, сопровождающий, комментирует, что он определенно заинтересован в том, чтобы сделать это правильным образом - очевидно, никто из нас не уверен, что это такое. (Мой вопрос не зависит от этой проблемы.)

Мур
источник

Ответы:

5

Я бы продолжил использовать сценарии pre / post inst,

preinst - этот сценарий выполняется до того, как этот пакет будет распакован из файла архива Debian (".deb"). Многие сценарии preinst останавливают службы для пакетов, которые обновляются до тех пор, пока не завершится их установка или обновление (после успешного выполнения сценария postinst).

postinst - этот скрипт обычно завершает любую необходимую настройку пакета foo после распаковки foo из его архива Debian (".deb"). Часто сценарии postinst запрашивают ввод данных и / или предупреждают пользователя о том, что, если он принимает значения по умолчанию, он должен не забывать возвращаться и переконфигурировать этот пакет, как того требует ситуация. Многие сценарии «postinst» затем выполняют любые команды, необходимые для запуска или перезапуска службы после установки или обновления нового пакета.

смотрите - https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html

Синтаксис вызова start | stop | restart написан как условный, см. Раздел https://www.debian.org/doc/debian-policy/ch-opersys.html 9.3.3.2 Запуск initscripts

if который invoke-rc.d> / dev / null 2> & 1; затем

пакет invoke-rc.d

еще

/etc/init.d/package

фи

так ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

и добавьте еще одно условие для systemd при необходимости;)

Так что да, правильный способ запустить | остановить | перезапустить службу - по возможности использовать соответствующий скрипт-обертку (invoke-rc.d / system), а не вызывать скрипт init (/etc/init.d/package) и возврат к сценарию /etc/init.d, когда обертка недоступна.

пантера
источник
Это в значительной степени отвечает большинству моих сомнений, кроме одного. Страница invoke-rc.dman и документация по политике Debian говорят нам, чтобы использовать ее в связи со /etc/init.d/сценариями (возможно, потому что они все еще использовали sysv-init). Как это меняется с Upstart или systemd?
Муру
Обновите свой вопрос или опубликуйте ссылку на информацию, которую вы читаете. Я не видел ничего в справочной странице об упаковке. Я полагаю, это зависит от вашего сервиса и сценария инициализации (это выскочка? Systemd?) Вы спрашиваете на askubuntu.com, а ubuntu использует выскочку, поэтому askubuntu.com/questions/58404/how-to-start-and-stop -а-сервис . Если ваш пакет использует старый скрипт инициализации, он должен быть преобразован в upstart и в долгосрочной перспективе - systemd.
Пантера
Я обновил вопрос.
Муру
На вопрос нет простого или однозначного ответа, так как «это зависит». Это немного временная ситуация, так как продвижение ubuntu и debian будет использовать systemd. Вы должны использовать invoke-rc.d для сервисов в Debian (или Ubuntu), которые используют sysv-init и service ... в Ubuntu для сервисов, которые используют upstart. Это сценарий, поэтому будьте изобретательны, если нужноinvoke-rc.d ... || service ...
Пантера
Я думал, что вы спрашиваете, должны ли вы использовать сценарии pre / post inst, а не синтаксис вашего сценария.
Пантера
0

Лучший способ для системной системы - использовать deb-systemd-invoke .

Разван Григоре
источник
1
Пожалуйста, дайте больше информации о том, как использовать deb-systemd-invoke.
Cynplytholowazy