インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る

systemctl startでUnit not foundになる原因と確認手順

systemctl start example.serviceの実行時にUnit example.service not found、Unit example.service could not be foundなどが出たら、Unit名、systemdが探索する場所、読込み状態、system/userの区別を確認します。設定ファイルを新規作成する前に、既存のUnitを見落としていないか切り分けます。

このページの目的

start時にUnit定義を見つけられない問題を対象にします。Unitは見つかるが実行に失敗する場合、enable自体が失敗する場合は各専用ガイドに分けます。

最初にやること

systemctl status、systemctl list-unit-files、systemctl catを使い、サービス名の誤りか、Unit未配置か、読み込みが古いのかを確認します。

このページの担当:systemctl startやstatusでUnitを見つけられない状態です。systemctl enable時のFailed to enable unitは別ガイドで扱います。

新しいUnitを作る前に

サービス名・Unit定義・実行対象を確認し、既存のパッケージ管理・構成管理から逸脱したUnitを増やさないようにします。

Unitをレビュー

Unit not foundはアプリの起動エラーと違う

systemdが指定したUnitを解決できないと、Unit … not foundなどが表示されます。これは通常、実行プログラムが異常終了したことではありません。まずUnit名とUnit定義を特定してから、構文・実行ファイル・権限を調べます。

いきなりUnitを自作しない:パッケージや構成管理がすでにUnitを提供していることがあります。管理外で同名Unitを作ると、アップデート後の衝突や既存サービスの上書きにつながります。

最初に状態とUnitの有無を確認する

systemctl status example.service --no-pager -l systemctl show example.service -p LoadState -p FragmentPath -p UnitFileState systemctl list-unit-files 'example*' systemctl cat example.service

LoadState=not-foundならUnit定義を解決できていない可能性があります。FragmentPathやsystemctl catの結果と照合し、systemdが実際に参照しているファイルを確認します。systemctl list-unitsはロード済みUnitの一覧なので、ディスク上のUnitファイル全体を見るlist-unit-filesと意味が異なります。

1. Unit名とサービス種別を確認する

systemctl list-unit-files --type=service systemctl list-unit-files 'example*' systemctl status example.service --no-pager -l

.serviceを省略するとserviceとして補われるコマンドもありますが、.socket・.timer・.mountなどを扱う場合は種別を明示してください。テンプレートUnitはexample@.serviceとexample@instance.serviceの区別があります。

実際のサービス名が製品名と異なる場合や、パッケージ更新でUnit名が変わった場合があります。まず候補一覧とパッケージのドキュメントを確認します。

2. 配置先・インストール状態・管理元を確認する

# 管理者が置いたsystem Unitの一般的な配置先 ls -l /etc/systemd/system/example.service # パッケージ由来のUnitがあるか確認(配置はOS依存) ls -l /usr/lib/systemd/system/example.service ls -l /lib/systemd/system/example.service # 実際に読み込む構成はこれを優先 systemctl cat example.service

ディストリビューションによって配置先や/libと/usr/libの関係が異なります。例示されたパスが存在しないだけで異常とは言えません。systemctl catが参照できないなら、ソフトウェアのインストール有無・提供パッケージ・構成管理の適用履歴を確認します。

パッケージ管理を優先:インストールすべきサービスなら、対象OSの正規パッケージ・構成管理の手順から復旧します。インターネット上のUnit定義をコピーして代替しないでください。

3. Unitを追加・編集したならdaemon-reloadを検討

# 対象Unitを追加・修正した後、定義を再読込 sudo systemctl daemon-reload # 読込み後のUnit実体を確認 systemctl cat example.service systemctl show example.service -p LoadState -p FragmentPath

daemon-reloadはsystemdのUnit構成を再読込します。サービスを起動する操作ではありません。Unit名の誤り、未インストール、間違った探索パス、system/userの相違は、再読込だけで解決しない場合があります。Unitファイルの編集・再読込の詳しい違いはdaemon-reloadガイドを参照してください。

4. systemとuserのスコープを分ける

# システム全体のUnitを確認 systemctl list-unit-files --type=service # ログイン中のユーザーのUnitを確認 systemctl --user list-unit-files --type=service systemctl --user status example.service --no-pager -l

systemctlとsystemctl --userは別のマネージャーに問い合わせます。ユーザー用Unitは一般に~/.config/systemd/user/等の探索先を使います。user Unitを変更した場合は、そのユーザーのログイン環境でsystemctl --user daemon-reloadが必要になることがあります。

sudo systemctl --userを安易に使うと別ユーザーの管理領域やセッションにアクセスしてしまうため、実行者とユーザーセッションを確認します。コンテナなどsystemdがPID 1ではない環境では、そもそもsystemctlが利用できない場合があります。

結果に応じた次の対応

確認結果次の対応
単なる名前・拡張子・テンプレート名の誤り既存Unitの正式名を特定し、意図する対象を指定して再確認する
ファイルを新規追加した直後保存場所・所有者・読み取り可否を確認し、systemd管理Unitならdaemon-reload後にcatで再確認
パッケージが未インストール・削除されているパッケージ管理と変更記録を確認して正規のインストール・復旧手順を採用
--user側にUnitがあるユーザー用マネージャーとセッション管理を用いて状態確認・起動を行う
Unitは見つかったが起動しない起動障害ガイドでExecStart・journal・依存関係を確認
Failed to enableだけが出るenable失敗ガイドでInstall設定・masked・static等を確認

修正後はUnit解決とアプリ動作を分けて確認

systemctl show example.service -p LoadState -p FragmentPath -p ActiveState systemctl cat example.service # 起動する必要がある場合だけ、変更手順に従って実施 sudo systemctl start example.service systemctl status example.service --no-pager -l journalctl -u example.service -b --no-pager -n 50

LoadState=loadedになってもサービスが正常稼働しているとは限りません。依存サービスやアプリ側のヘルスチェック・待受ポートを確認してください。問題が続く場合は、正式Unit名、探索先、パッケージ版、構成管理差分、journalをまとめて調査します。

公式・一次資料