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


10

構成パッケージを作成していますが、構成が影響を受けるサービスを停止して再起動します。今service [stop|restart]{pre,post}{inst,rm}邪魔に使っています。サービスについてのユーザーの好みを尊重するのでinvoke-rc.d、私はそれが正しい方法である質問をどこかで読みました。しかし、これに関するガイドラインは見つかりませんでした。誰かがそのようなガイドラインを知っていますか?または、どの方法を選ぶべきかについてアドバイスがありますか?パッケージは内部で使用されるものであり、今後2年間はたぶん14.04のみになります。ただ、後継者にsystemdは出来るだけ綺麗な状態を残したいので、心の中で考えています。

invoke-rc.dmanページから:

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

Debianポリシーマニュアル、第9章、セクション3.3から

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

...

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

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

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

たとえば、ここではinvoke-rc.dvs に関するDockerの問題serviceです。この問題はまだ解決されておらず、おそらくメンテナである1人が、正しい方法でこれを行うことに間違いなく関心があるとコメントしています。(私の質問はその問題とは無関係です。)

回答:


5

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パッケージ

そうしないと

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


これで、1つを除いて、私の疑問のほとんどが解決されます。invoke-rc.dmanページやDebianポリシーのドキュメントはに関連して、それを使用することを教えてくれる/etc/init.d/(彼らはまだはsysv-のinitを使用可能性があるため)スクリプト。Upstartやsystemdでどのように変わりますか?
muru 2014

質問を更新するか、読んでいる情報へのリンクを投稿してください。パッケージに関するmanページには何も表示されませんでした。そう、私はそれがあなたのサービスおよびあなたはaskubuntu.comに求めているinitスクリプト(であること成り上がり?systemdに?)に依存するとし、そしてUbuntuは成り上がり使用していますaskubuntu.com/questions/58404/how-to-start-and-stop -a-service。パッケージが古いinitスクリプトを使用している場合は、今のところそれをupstartに変換し、長期的にはsystemdにする必要があります。
パンサー

質問を更新しました。
muru 2014

「依存する」ため、質問に対する簡単な回答や単一の回答はありません。これは、ubuntuとdebianの両方がsystemdを使用するため、一時的な状況です。Debian(またはUbuntu)でsysv-initを使用するサービスにinvoke-rc.dを使用し、upstartを使用するサービスにUbuntuでservice ...を使用する必要があります。スクリプトなので、必要に応じてクリエイティブにしてくださいinvoke-rc.d ... || service ...
パンサー14

スクリプトの構文ではなく、pre / post instスクリプトを使用するかどうかを尋ねていると思いました。
パンサー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.