WantedBy=multi-user.targetとは?systemd自動起動の仕組みと確認方法
WantedBy=multi-user.targetは、サービスを通常のマルチユーザー起動へ紐付けるための設定です。書いただけでは自動起動にならず、systemctl enableが必要です。
このページで分かること
- WantedByが作用するタイミング
- enable・start・--nowの違い
- 自動起動の確認と解除方法
先に結論
このページの役割: このページは、自動起動の紐付けとenableの内部動作に特化しています。Unit全体の作り方はsystemd Unit設定ガイドを参照してください。
WantedBy=multi-user.targetは「起動時にこのサービスを開始するリンクを、enable時に作る」という意味です。Unitの起動順序や依存関係を直接指定する設定ではありません。
自分のUnitファイルを確認する
Unitを貼り付けて、WantedBy、自動起動、依存関係、再起動設定の注意点を確認できます。
WantedBy=multi-user.targetの意味
WantedBy=は[Install]セクションに記述し、systemctl enableを実行したときに、どのtargetやUnitから弱い依存関係で呼び出されるようにするかを定義します。
[Install]
WantedBy=multi-user.target
multi-user.targetは、一般的なサーバー用途で多くのシステムサービスが起動した状態を表すtargetです。GUIを必要としない常駐サービスでは、よく利用されます。
重要:
WantedBy=は起動順序を指定しません。別Unitより後に起動したい場合はAfter=、相手も起動対象へ加えたい場合はWants=やRequires=を別途検討します。enableすると何が起きるか
サービスをenableすると、通常はmulti-user.target.wants配下にUnitファイルへのシンボリックリンクが作られます。これにより、次回の通常起動時にサービスが起動対象へ加わります。
sudo systemctl enable example.service
systemctl is-enabled example.service
systemctl list-dependencies multi-user.target | grep example
実際のリンク先はディストリビューションやUnitの配置場所によって異なります。次のコマンドで確認できます。
systemctl cat example.service
systemctl show example.service -p UnitFileState -p FragmentPath
start・enable・--nowの違い
| 操作 | 現在の起動 | 次回起動時 |
|---|---|---|
systemctl start | 起動する | 自動起動設定は変えない |
systemctl enable | 通常は起動しない | 自動起動を有効化 |
systemctl enable --now | 起動する | 自動起動も有効化 |
systemctl disable --now | 停止する | 自動起動も無効化 |
設定例と確認コマンド
[Unit]
Description=Example API
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=appuser
ExecStart=/usr/local/bin/example-api
Restart=on-failure
[Install]
WantedBy=multi-user.target
この例では、ネットワークオンライン用targetを起動対象へ加え、その後にサービスを起動します。enableすると通常のマルチユーザー起動へ紐付きます。
sudo systemd-analyze verify /etc/systemd/system/example.service
sudo systemctl daemon-reload
sudo systemctl enable --now example.service
systemctl is-enabled example.service
systemctl is-active example.service
よくある勘違い
- Unitへ
WantedBy=を書いただけで自動起動になると思う enableすれば現在も起動すると考えるWantedBy=が起動順序や通信可能状態を保証すると考える- Unit変更後に
daemon-reloadを忘れる - テンプレートUnitやstatic Unitにも同じ使い方ができると思う
安全な変更手順
sudo systemd-analyze verify /etc/systemd/system/example.service
sudo systemctl daemon-reload
sudo systemctl enable --now example.service
systemctl status example.service --no-pager -l
systemctl is-enabled example.service
確認ポイント: 自動起動の設定状態は
is-enabled、現在の稼働状態はis-activeで別々に確認します。