サービス再起動すると他のサービスも再起動する(Systemd,Requires)
Systemdで依存関係を定義してあると、サービスを再起動した際、他のサービスも再起動します(当たり前ですが)。
本記事は、SystemdのRequiresディレクティブについて整理しておきたい点をまとめたものです。対象は主にRHEL7、CentOS7以降です。
なお、Systemdの基本的なサービス管理については、こちらの記事にまとめてあります。
本記事の目的
- SytemdのRequiresディレクティブについて把握する。
- Requires以外にWants,BindsToディレクティブについて把握する。
基本
サービス再起動すると他のサービスも再起動する動作
サービスA(例えばアプリケーション)とサービスB(例えばDB)があり、サービスAのユニットファイルに、Requires=(サービスB)
が設定されているとします。
[サービスA] →(依存)→ [サービスB]
ということです。
このときの基本的な動作について記載します。
-
サービスAの起動
# systemctl start (サービスA)
→サービスBも起動
サービスAを起動すると、サービスBも起動されます。
※これがRequiresディレクティブの主な役割 -
サービスBの再起動
# systemctl restart (サービスB)
→サービスAも再起動
サービスBを再起動すると、サービスAも再起動されます。 -
サービスBの停止
# systemctl stop (サービスB)
→サービスAも停止
サービスBを停止すると、サービスAも停止されます。
※ただし、その後サービスBだけを起動しても、サービスAは起動しないので注意 -
systemdを経由しないサービスBの停止
→サービスAは停止しません。
systemctlコマンドを使用せずにサービスBが停止した場合に該当します。停止の理由は様々で、サービスBの仕様動作、不具合、関連デバイスの取り外し等が挙げられます。
Afterディレクティブとの関連性
サービスAのユニットファイルに、After=(サービスB)
が記載されていると、前述の”1. サービスAの起動”や”2. サービスBの再起動”の際、サービスBの起動が完了してからサービスAの起動を開始します。
記載されていない場合、同時に起動開始されます。
例えば、サービス起動時にDB接続できないと起動失敗するアプリケーションの場合、Afterディレクティブの設定が必要でしょう。
詳細
関連ディレクティブ(Wants、BindsTo)
-
依存関係の強さは弱いものから順に、Wants < Requires < BindsTo です。
-
前述の”1. サービスAの起動”の動作のみでよければ、Requiresの代わりにWantsディレクティブを使用すべきです。
-
前述の”4. systemdを経由しないサービスBの停止 “の際にもサービスAを停止させたい場合、Requiresの代わりにBindsToディレクティブを使用すべきです。
BindsToで指定したユニットがactiveでない限り、自身のユニットはactiveにならないという設定です。
まとめ
本記事は、SystemdのRequiresディレクティブについて整理しておきたい点をまとめてみました。
参考
関連URL等
-
Requiresによる再起動の動作に関する説明
マニュアルに記載があります。
(“this unit will be stopped (or restarted) if one of the other units is explicitly stopped (or restarted).”) -
なお、上記のfreedesktop.orgの記載と、システム上で
man systemd.unit
を実行した際の記載は若干言い回しが違います。 -
分かりやすいまとめ
systemd で Requires/Wants/BindsTo/PartOf を設定したサービスの開始や停止時の伝播のマトリクス