systemd はシステム コンポーネントとサービス間の依存関係をどのように管理しますか?
systemd はユニットを使用してシステム コンポーネントとサービスを定義します。各ユニットには、ユニットのプロパティと依存関係を定義する対応する構成ファイルがあります。
systemd は構成ファイルを使用してサービス間の依存関係を管理します。これらの構成ファイルは通常、システム構成に応じて/etc/systemd/system/
1 つまたは複数のディレクトリにあります。/usr/lib/systemd/system/
systemd が依存関係を管理する一般的な方法をいくつか示します。
-
Requires および Wants:ユニット構成ファイルで
Requires
およびキーワードを使用することによりWants
、ユニットが他のユニットに依存することを指定できます。Requires
強い依存関係を示します。つまり、現在のユニットを開始するには、依存するユニットが正常に開始される必要があります。Wants
弱い依存関係を示します。つまり、依存ユニットの起動は必要ありませんが、依存ユニットが使用可能な場合は、現在のユニットが最初に起動されます。 -
Before および After:
Before
およびAfter
キーワードを使用して、ユニット間の開始順序を定義できます。Before
は、現在の単位が指定された単位の前に開始される必要があることを示し、After
現在の単位が指定された単位の後に開始される必要があることを示します。これにより、起動時にサービスが事前に定義された順序で開始されるようになります。 -
PartOf および RequiresMountsFor:
PartOf
ユニットが別のユニットの一部であることを定義するために使用されるキーワード。マスター ユニットが起動または停止すると、それに応じてスレーブ ユニットも起動または停止します。RequiresMountsFor
ユニットに必要なファイルシステムのマウント ポイントを指定するために使用されるキーワード。 -
OnFailure:
OnFailure
キーワードを使用すると、指定したユニットの起動に失敗した場合にのみ起動するユニットを定義できます。これは、フォールト トレランス メカニズムとフォールバック サービスを定義するのに役立ちます。
これらの依存関係構成により、systemd は、起動および管理中にサービスが正しい順序で開始および停止されることを保証します。依存関係を定義すると、サービスが依存する他のサービスが利用可能な場合にのみサービスが開始されるようにすることもできるため、システムの信頼性と安定性が向上します。
systemctl
コマンドを使用して、ユニットとその依存関係を表示および管理できます。たとえば、systemctl status <unit>
ユニットのステータスと依存関係を表示したり、systemctl enable <unit>
ユニットを有効にしたり、systemctl start <unit>
ユニットを開始したりすることができます。
依存関係を適切に管理および構成するには、systemd のドキュメントを注意深く読み、各ユニットのプロパティとキーワードの意味を理解することをお勧めします。
例
次にRequires
、Wants
、 、Before
およびを使用したAfter
例を示します。
serviceA.service
とという 2 つのサービスがあるとしますserviceB.service
。serviceA.service
を開始する前に開始する必要がありserviceB.service
、serviceB.service
他のサービスに依存しません。
serviceA.service
設定ファイルの内容は以下のとおりです。
[Unit]
Description=Service A
Requires=serviceB.service
After=serviceB.service
[Service]
ExecStart=/path/to/serviceA
serviceB.service
設定ファイルの内容は以下のとおりです。
[Unit]
Description=Service B
[Service]
ExecStart=/path/to/serviceB
この例では、serviceA.service
構成ファイル内の はが に依存することをRequires=serviceB.service
示し、は の後に開始する必要があることを指定します。こうすることで、 の起動時にsystemd が自動的に起動し、より前にsystemdが必ず起動します。serviceA.service
serviceB.service
After=serviceB.service
serviceA.service
serviceB.service
serviceA.service
serviceB.service
serviceB.service
serviceA.service
上記の例はデモンストレーションのみを目的としており、サービスのニーズと複雑さに応じて、実際の構成ファイルにはさらに多くのオプションと設定が必要になる場合があることに注意してください。
公式の例
コマンド ラインを使用して、オペレーティング システムの既存のサービス構成を表示します。acpid.service
xzbd@ubuntu:~$ cat /usr/lib/systemd/system/acpid.service
[Unit]
Description=ACPI event daemon
Requires=acpid.socket
ConditionVirtualization=!container
Documentation=man:acpid(8)
[Service]
StandardInput=socket
EnvironmentFile=/etc/default/acpid
ExecStart=/usr/sbin/acpid $OPTIONS
[Install]
WantedBy=multi-user.target