systemdサービスが起動しない・failedになる原因と確認手順
このページの目的
systemdサービスが起動しない原因を、Unitの読込み、構文、実行条件、アプリ自身の失敗の順に特定します。最終的なゴールは、最初の失敗箇所を1つに絞り、安全に再起動できる状態にすることです。
最初にやること
最初に systemctl status と journalctl -u を確認します。そこで得た状態コードを起点に、構文検証、実行ユーザーでの手動実行、パスと権限の確認へ進みます。
このページの対象:このページは「手動で
systemctl start しても起動しない」場合が対象です。再起動後だけ自動起動しない場合は、systemctl enable後に自動起動しないガイドを確認してください。Unitファイルを実行前に確認
起動に失敗したUnitを貼り付けて、実行パス、権限、依存関係、再起動ループにつながる設定を確認できます。
最初に失敗の種類を分ける
最初に、次のどこで止まっているかを分けます。
- Unitを見つけられない:Unit名・配置・再読込みを確認
- Unitは読めるが実行できない:
ExecStart、作業ディレクトリ、権限を確認 - プロセスは起動するが終了する:アプリの終了コードとjournalを確認
- 短時間に失敗を繰り返す:再起動ループより前の最初の失敗を確認
systemctl status example.service --no-pager -l
journalctl -u example.service -b --no-pager -n 100
よくある表示・症状から原因を絞る
表示された文言は原因そのものではなく、確認範囲を絞る手掛かりです。「考えられる原因」と「最初の確認方法」を対応させて確認します。
| エラー・症状 | 考えられる原因 | 最初の確認方法 |
|---|---|---|
Unit example.service could not be found | Unit名の誤り、配置先違い、またはdaemon-reload未実施 | systemctl cat example.service とUnit配置先を確認 |
status=203/EXEC | ExecStartの実行ファイルが存在しない、実行できない、またはshebangが不正 | namei -l、file、先頭行のshebangを確認 |
status=200/CHDIR | WorkingDirectoryが存在しない、または実行ユーザーが到達できない | namei -l /path/to/workdir で各階層を確認 |
Permission denied | User=の実行権限不足、親ディレクトリ権限、SELinux拒否など | sudo -u 実行ユーザー でExecStart相当を手動実行 |
Start request repeated too quickly | 短時間に起動失敗を繰り返し、systemdの開始制限に達した | journalctl -u 対象.service -b で最初の失敗を確認 |
Failed with result exit-code | ExecStartのプロセスが非0の終了コードで停止した | 同じユーザー・環境でExecStart相当を実行し終了コードとログを確認 |
原因を切り分ける確認手順
Unitを再読込する
sudo systemctl daemon-reload systemctl cat example.service編集したUnitが読み込まれているか確認します。
構文と参照先を検証する
systemd-analyze verify /etc/systemd/system/example.service未知の設定名、依存関係、実行ファイルなどの警告を確認します。
状態とjournalを確認する
systemctl status example.service --no-pager -l journalctl -u example.service -b --no-pager -n 100statusの要約だけで判断せず、同じ時刻のjournalを読みます。実行ユーザーで手動実行する
sudo -u appuser /usr/bin/python3 /opt/example/app.pysystemdを介さず同じユーザー・同じコマンドで実行し、権限や環境依存を切り分けます。
パスと権限を確認する
namei -l /opt/example/app.py sudo -u appuser test -x /usr/bin/python3 && echo OK対象ファイルだけでなく、親ディレクトリを辿れるかも確認します。
確認結果から次の対応を決める
| 確認結果 | 次の対応 |
|---|---|
| 手動実行も失敗 | アプリ、引数、設定ファイル、権限を修正します。 |
| 手動実行は成功 | 環境変数、WorkingDirectory、User、systemdのサンドボックス設定を確認します。 |
| 起動後すぐ正常終了 | 常駐プロセスか、Type=が適切か確認します。 |
| 再起動を繰り返す | 一時的に再起動設定を抑え、最初の失敗ログを確認します。 |
この症状で多い原因
- Unit変更後に
daemon-reloadしていない ExecStartや作業ディレクトリの誤り- 実行ユーザーがファイルや親ディレクトリへアクセスできない
- ログインシェルと同じPATHや環境変数を期待している
- シェルのパイプやリダイレクトを
ExecStartへそのまま書いている
修正後の確認と再発防止
sudo systemctl reset-failed example.service
sudo systemctl restart example.service
systemctl is-active example.service
journalctl -u example.service -b --no-pager -n 50
起動できたことだけでなく、再起動後も意図した状態を維持するか、ログに継続的なエラーがないか確認します。