systemd の依存関係、設定ミスで起動順にズレ『サーバOSの話②』
systemd に慣れていない初学者がよく踏む落とし穴。
サービス自体の設定は正しいのに、
“起動順がズレている”ためにサービスが正常に動かない。
特に Web+DB、アプリ+ネットワーク、ストレージマウントなどの組み合わせで多発する。
起動順は目に見えないため、原因特定が遅れやすい。
systemd を使う以上、避けて通れないポイントだ。
ひと言まとめ
systemd は依存関係がすべて。
正しく書かれていないと、サービスが想定外の順番で起動する。
症状(あるある)
サービスは“起動した”と出るが、実際は動いていない
Webアプリが DB につながらずエラー
NFS をマウントできず、アプリがコケる
ネットワークが上がる前にサービスが起動して失敗
再起動したときだけ動かない(手動起動は成功)
systemctl status では正常に見えるが、ログに Connection refused
原因と仕組み(なぜ起きる?)
Unitファイルの After / Wants / Requires の理解不足
“ネットワークが上がった後に起動すべきサービス”に
After=network-online.target を書き忘れDB 依存アプリに Requires= を書かず、先に起動して失敗
mount系ユニットの依存順が不整合で、再起動時だけエラー
Unitファイル編集後に daemon-reload を実施していない
systemd は parallel(並列)起動のため、暗黙の依存は成立しない
図:起動順ズレの典型例(アプリが DB より先に起動して失敗)
起動順(誤):
[App] → [DB]
↓ ↑
DB未稼働で接続失敗
起動順(正):
[DB] → [App]
切り分け(最短コース)
journalctl で起動直後のログを確認
journalctl -u app.service -b
依存関係の確認
systemctl show app.service | grep -E "After|Requires|Wants"
ネットワーク系サービスの起動タイミング確認
systemctl status network-online.target
手動起動で成功するか
→ 手動OK・再起動NGなら“起動順”が原因Unitファイルの編集有無確認
→ /etc/systemd/system/*.service を確認
Vendor提供の unit を上書きしていないかチェック
今すぐ効く対処(テンプレ)
依存関係を正しく追記
例:アプリが DB に依存する場合
/etc/systemd/system/app.service[Unit] After=network-online.target mariadb.service Requires=mariadb.service
ネットワーク依存サービスは必ず network-online.target を使用
systemctl enable NetworkManager-wait-online.service
Unit 変更後は必ず
systemctl daemon-reload
再起動して起動順が期待通りか確認
systemctl reboot
恒久対策/再発防止チェックリスト
依存関係(Requires/After)を明文化したテンプレを用意
ネットワーク依存は network-online.target を徹底
Unitファイル編集後の daemon-reload を標準手順に
DB・ストレージなど基盤サービスは先に起動させる
mountユニットは RequiresMountsFor= を活用
再起動テストを必ず実施(手動起動だけで判断しない)
Vendor Unit 上書きは避け、カスタム Unit に分離
systemd-analyze で起動シーケンスを定期確認
落とし穴(やりがちミス)
“After=network.target” を書けばOKと思い込む(不十分)
App → DB の順で起動してしまい、深夜バッチが毎回失敗
mount失敗が依存順のせいだと気づかず永遠に調査
vendor提供の unit を直接書き換えてアップデートで消える
“手動起動OKだから大丈夫”と思って本番で落ちる
変更後の確認ポイント
依存するサービスが正常に起動している
journalctl に再発ログが出ていない
再起動後もアプリが安定稼働
systemd-analyze で起動順が期待通り
Unit ファイルの整合性が取れている
まとめ(行動指針)
systemd の本質は “依存関係の明確化”。
ここをミスると OSブート時の不具合は永遠に解決しない。
依存を書く → 並列起動を理解する → 再起動で確認。
これだけで systemd 起因のトラブルは劇的に減る。
