インフラ作業支援ラボInfra Support Lab← ガイド一覧← 戻る
問題発生時のトラブル解決ガイド

systemctl enableしたのに自動起動しない原因と確認手順

このページの目的

「enableされていない」のか、「enableはされているが起動時に失敗・スキップされた」のかを分けます。最終的なゴールは、再起動時にどのtargetから呼ばれ、どこで起動が止まったかを確認することです。

最初にやること

最初に systemctl is-enabled で登録状態を確認し、次に journalctl -b -u で現在の起動時ログを確認します。登録と実行結果を混同しないことが重要です。

このページの対象:このページは「手動起動はできるが、再起動後に自動起動しない」場合が中心です。手動起動そのものが失敗する場合は、systemdサービスが起動しないガイドを先に確認してください。

systemd Unitを適用前に確認

Unitファイルを貼り付けて、WantedBy、依存関係、Restart、実行ユーザーなどの注意点を確認できます。

systemd設定を作成・確認

最初に登録と起動結果を分ける

enableは今すぐ起動する操作ではありません。まず次の2点を別々に確認します。

systemctl is-enabled example.service systemctl status example.service --no-pager journalctl -b -u example.service --no-pager

よくある表示・症状から原因を絞る

表示された文言は原因そのものではなく、確認範囲を絞る手掛かりです。「考えられる原因」と「最初の確認方法」を対応させて確認します。

エラー・症状考えられる原因最初の確認方法
disabledenableされておらず、自動起動用のリンクが作成されていないsystemctl is-enabled と enable実行結果を確認
static[Install]がなく、単独では通常のenable対象にならないUnitsystemctl cat と、そのUnitを起動する依存元を確認
indirectAlso=や別名Unitを経由して有効化する構成systemctl cat とUnitのシンボリックリンクを確認
The unit files have no installation config[Install]、WantedBy=、RequiredBy=、Alias=などの有効化設定がないUnitの[Install]と設計上の起動方法を確認
Failed to enable unit: Unit file ... does not existUnit名の誤り、配置先違い、またはdaemon-reload未実施systemctl list-unit-files とUnit配置先を確認
Condition ... was not metCondition指定の判定がfalseになり、起動がスキップされたsystemctl show -p Conditions -p ConditionResult で条件判定を確認
Dependency failed for ...依存先Unit、mount、networkなどが起動に失敗したjournalctl -b と systemctl list-dependencies を確認

原因を切り分ける確認手順

  1. enable状態を確認する

    systemctl is-enabled example.service systemctl list-unit-files example.service

    enabled以外なら、Unitに[Install]があるか、正しいUnit名を指定しているか確認します。

  2. 作成されたリンクを確認する

    systemctl show -p FragmentPath example.service find /etc/systemd/system -type l -lname '*example.service' -ls

    想定するtarget配下にリンクが作られているか確認します。テンプレートUnitやaliasを使う場合は対象名にも注意します。

  3. 起動時の失敗ログを確認する

    journalctl -b -u example.service --no-pager systemctl status example.service --no-pager

    -bで現在の起動以降のログに絞り、依存先、権限、実行パス、環境変数などを確認します。

  4. 条件・依存関係を確認する

    systemctl show example.service -p Wants -p Requires -p After -p ConditionResult systemd-analyze verify /etc/systemd/system/example.service

    ConditionPathExists=などの条件が不成立だと、失敗ではなくスキップされることがあります。

  5. 再起動前に起動経路を試す

    sudo systemctl daemon-reload sudo systemctl restart example.service systemctl status example.service --no-pager

    手動起動できても、起動時だけ利用できないネットワーク、マウント、秘密情報、名前解決などがないか確認します。

確認結果から次の対応を決める

結果次の対応
disabled / static[Install]WantedBy=、Unit名を確認します。
enabledだがinactivejournalctl -b -uで起動時ログとConditionを確認します。
dependency failed依存先Unit、マウント、ネットワークの状態を先に確認します。
手動起動は成功する起動順序、環境変数、起動時に未準備のリソースを疑います。

この症状で多い原因

再発防止

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構文、enable状態、依存先、起動ログを事前に確認してください。

systemd Unitを適用前に確認

Unitファイルを貼り付けて、WantedBy、依存関係、Restart、実行ユーザーなどの注意点を確認できます。

systemd設定を作成・確認