web-dev-qa-db-ja.com

パッケージのインストール中に依存サービスを再起動する正しい方法は何ですか?

構成パッケージを作成していますが、構成に影響するサービスを停止および再起動したいです。現在、service [stop|restart]{pre,post}{inst,rm}の方法で使用しています。 invoke-rc.drightの方法であるという質問をどこかで読んだのは、サービスに関するユーザーの好みを尊重しているからです。しかし、これに関するガイドラインは見つかりませんでした。誰もがそのようなガイドラインを知っていますか?または、どの方法を選択すべきかについてアドバイスがありますか?このパッケージは内部で使用され、今後2年間は14.04のみ使用される予定です。ただし、後継者のためにできるだけきれいな状態を残したいので、systemdも頭に浮かびます。

invoke-rc.d manページ から:

Debianパッケージのメンテナースクリプトによるinitスクリプトへのすべてのアクセスは、invoke-rc.dを介して行う必要があります。

Debian Policy Manualから 第9章、セクション3.

メンテナーは、update-rc.dおよびinvoke-rc.dプログラムによって提供される抽象化レイヤーを使用して、postinst、prerm、postrmなどのパッケージのスクリプト内のinitscriptを処理する必要があります。

...

パッケージメンテナースクリプトは、/ etc/init.d/* initscriptを直接呼び出すのではなく、invoke-rc.dを使用して呼び出す必要があります。

Debianはsysv-initを使用しており、systemdに直接移行します。ポリシーマニュアルはsystemctlを参照するためにやがて更新されると思います。しかし、私が不確かなのはこれです:serviceの代わりにinvoke-rc.dを使用すべきですか? (トリガーを介して)いくつかのファイルに興味があることをdpkgに伝えることができるので、いくつかのサービスにも興味があり、dpkgを取得するようにdpkgに伝える方法があります再起動/リロード?

明確にするために:Iはinitスクリプトを書いていません。 Puppet、NTPなど、他のアプリケーションの構成を含むパッケージを提供しているため、スクリプト内の対応するサービスを停止して再起動します。

ここ は、たとえばinvoke-rc.d vs serviceに関するDockerの問題です。この問題はまだ開いており、おそらくメンテナーの一人が、これをrightの方法で行うことに間違いなく興味があるとコメントしています。 (私の質問はその問題とは無関係です。)

10
muru

Pre/post instスクリプトを引き続き使用しますが、

preinst-このスクリプトは、パッケージがDebianアーカイブ( ".deb")ファイルから展開される前に実行されます。 多くの「preinst」スクリプトは、インストールまたはアップグレードが完了するまでアップグレードされるパッケージのサービスを停止します(「postinst」スクリプトの正常な実行後) 。

postinst-このスクリプトは通常、fooがDebianアーカイブ( ".deb")ファイルから展開されると、パッケージfooの必要な設定を完了します。多くの場合、「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パッケージ

else

/etc/init.d/package

fi

そう ...

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スクリプトにフォールバックします。

5
Panther

Systemdシステムのより良い方法は、 deb-systemd-invoke を使用することです。

0
Razvan Grigore