Systemd ユニット ファイルにおける Wants= と WantedBy= のベスト プラクティス

Systemd ユニット ファイルにおける Wants= と WantedBy= のベスト プラクティス

私が知る限り、文書からシステム、同じ機能を実行しますWants=WantedBy=、前者は依存ユニット ファイルに配置され、逆もまた同様です。(つまり、ディレクトリWantedBy=を作成しunit.type.wants、そこにシンボリック リンクを配置します。)

からDigitalOcean: Systemd ユニットとユニット ファイルを理解する:

ディレクティブ... を使用すると、セクションのディレクティブWantedBy=と同様の方法で依存関係を指定できます。違いは、このディレクティブが補助ユニットに含まれているため、リストされているプラ​​イマリ ユニットが比較的クリーンなままであることです。Wants=[Unit]

本当にユニット ファイルを「クリーン」に保つことが目的なのでしょうか? これら 2 つのディレクティブを使用するためのベスト プラクティスは何ですか? つまり、サービス アルファがサービス ベータを「必要とする」場合、いつ を使用しWants=beta.service、いつalpha.serviceを優先するべきなのでしょうか? WantedBy=alpha.servicebeta.service

答え1

機能的に

Wantsは セクションにありUnitWantedByは にありますInstall

init プロセスはセクションをまったくsystemd処理/使用しません。代わりに、 にシンボリックリンクを作成する必要があります。通常、これはセクションを読み取るユーティリティによって行われます。Installmulti-user.target.wantssystemctlInstall

要約すれば、WantedBysystemctl enable/の影響を受けますsystemctl disable

論理的に

どのサービスが他のサービスを「認識」または「認識」する必要があるかを検討します。たとえば、 の一般的な使用法は次のとおりですWantedBy

[Install]
WantedBy=multi-user.target

あるいは、multi-user.target に次のように記述することもできます。

[Unit]
Wants=nginx.service

しかし、2 番目の方法は意味がありません。論理的には、nginx.service はシステム定義の multi-user.target を認識しますが、その逆ではありません。

したがって、あなたの例では、アルファの作成者がベータを認識している場合、アルファWantsはベータです。ベータの作成者がアルファを認識​​している場合、ベータはWantedByアルファです。

決定を下す際には、他のサービスがなくてもどのサービスをインストールできるか(たとえば、パッケージ マネージャーから)を検討してください。

設定ディレクトリ

ボックス内の別のツールとして、systemd ファイルは設定ディレクトリで拡張することもできることを知っておいてください: /etc/systemd/system/myservice.service.d/extension.conf

これにより、どちらのサービスも元々は互いを認識するように作成されていない依存関係を追加できます。私はこれをマウントでよく使用します。たとえば、nginx もマウントも互いを明示的に認識する必要はありませんが、システム管理者である私は依存関係を理解し​​ています。そのため、nginx.service.d/mymount.confで作成しますWants=mnt-my.mount

答え2

これらは機能的に同一ではありません。Wants=設定 (およびシンボリック リンク ファイル) は依存関係です。設定WantedBy=は、サービスが有効/無効になったときに、このような依存関係の作成/破棄を制御します。

だから最高練習。正しいenable実践。2 つのうちの 1 つだけが、特定の状況で正しい機能を持ちます。1 つは、常に存在する永続的な依存関係を持つことを意図しており、もう 1 つは、 /でオンとオフを切り替えることができる一時的な依存関係を持つことを意図していますdisable

関連情報