systemdのAfter・Wants・Requiresの違い|起動順序と依存関係
systemdでは「起動順序」と「依存関係」は別物です。After=だけでは相手を起動せず、Requires=だけでは希望する順序にならないことがあります。
このページで分かること
- After・Beforeが決めること
- Wants・Requiresが決めること
- 実務での組み合わせと確認方法
先に結論
このページの役割: このページは、起動順序と依存関係を比較し、要件に応じた組み合わせを選ぶことに特化しています。Unit全体の設定項目はsystemd Unit設定ガイドを参照してください。
「相手を起動対象に加えるか」はWants=・Requires=、「どちらを先に起動するか」はAfter=・Before=で指定します。必要なら両方を併用します。
依存関係を適用前にレビュー
Unitを貼り付けて、After・Wants・Requiresの不足や不自然な組み合わせを確認できます。
最初に押さえる違い
| 設定 | 種類 | 相手を起動対象へ加える | 主な役割 |
|---|---|---|---|
After= | 順序 | いいえ | 相手の起動処理より後に開始 |
Before= | 順序 | いいえ | 相手の起動処理より前に開始 |
Wants= | 弱い依存 | はい | 相手も起動対象に加える |
Requires= | 強い依存 | はい | 相手を必須寄りの依存として扱う |
AfterとBeforeは起動順序
After=database.serviceは、このUnitの起動処理をdatabase.serviceの起動処理より後へ並べます。しかし、database.service自体を起動対象へ加えるわけではありません。
[Unit]
After=database.service
注意: 順序関係は両方が同じトランザクションへ入った場合に意味を持ちます。相手も起動したいなら依存関係を併用します。
WantsとRequiresは依存関係
Wants=は弱い依存関係で、相手の失敗が常に自Unitの失敗になるわけではありません。Requires=はより強く、相手が停止・非アクティブ化された場合に自Unitも停止対象となる関係を作ります。
選び方: なくても一部機能だけ失われるなら
Wants=、相手なしではサービスとして成立しないならRequires=を検討します。ただし障害時の連鎖停止が適切かも確認してください。よく使う組み合わせ
相手を起動し、その後に自Unitを起動
[Unit]
Requires=database.service
After=database.service
相手が失敗しても自Unitの起動を試したい
[Unit]
Wants=metrics-agent.service
After=metrics-agent.service
相手より先に停止したい
起動順序は停止時に逆順で適用されます。After=database.serviceなら、停止時は自Unitがdatabase.serviceより先に停止する関係になります。
ネットワーク依存の注意点
[Unit]
Wants=network-online.target
After=network-online.target
この組み合わせはnetwork-online.targetを起動対象に加え、その後へ並べます。ただし、実際の通信可能状態を待つには、利用中のネットワーク管理サービスに対応するwait-onlineサービスが必要な場合があります。
さらに、起動後にネットワークが切断される可能性は別問題です。アプリ側の再接続、タイムアウト、リトライ設計も必要です。
確認コマンド
systemd-analyze verify /etc/systemd/system/example.service
systemctl show example.service -p After -p Before -p Wants -p Requires
systemctl list-dependencies example.service
systemctl list-dependencies --reverse database.service
実行前チェック: 「相手を起動する必要があるか」「相手より後に起動する必要があるか」「相手停止時に連鎖停止してよいか」を分けて判断します。