朝から昼寝

整理しておきたいIT関連の小ネタ

サービス再起動すると他のサービスも再起動する(Systemd,Requires)

概要

Systemdで依存関係を定義してあると、サービスを再起動した際、他のサービスも再起動します(当たり前ですが)。
本記事は、SystemdのRequiresディレクティブについて整理しておきたい点をまとめたものです。対象は主にRHEL7、CentOS7以降です。
なお、Systemdの基本的なサービス管理については、こちらの記事にまとめてあります。

本記事の目的

  • SytemdのRequiresディレクティブについて把握する。
  • Requires以外にWants,BindsToディレクティブについて把握する。


目次

基本

サービス再起動すると他のサービスも再起動する動作

サービスA(例えばアプリケーション)とサービスB(例えばDB)があり、サービスAのユニットファイルに、Requires=(サービスB)が設定されているとします。

[サービスA] →(依存)→ [サービスB]
ということです。

このときの基本的な動作について記載します。

  1. サービスAの起動
    # systemctl start (サービスA) →サービスBも起動
    サービスAを起動すると、サービスBも起動されます。
    ※これがRequiresディレクティブの主な役割

  2. サービスBの再起動
    # systemctl restart (サービスB) →サービスAも再起動
    サービスBを再起動すると、サービスAも再起動されます。

  3. サービスBの停止
    # systemctl stop (サービスB) →サービスAも停止
    サービスBを停止すると、サービスAも停止されます。
    ※ただし、その後サービスBだけを起動しても、サービスAは起動しないので注意

  4. 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にならないという設定です。

関連URL等