Linuxサーバーでサービスが起動しないとき、まず見るのは systemctl と journalctl です。
Red Hat公式のsystemdチートシートにも主要コマンドはまとまっていますが、実際に使うときは「どの順番で見るか」「何を見ればよいか」が分かると便利です。
この記事では、サービスの状態確認、ログ確認、自動起動、Unitファイル編集後の反映まで、使用者目線でsystemdまわりのコマンドを整理します。
サービスが起動しないときは、まず次の順番で見ると原因を絞りやすいです。
| 順番 | コマンド | 何を見るか |
|---|---|---|
| 1 | systemctl status your.service |
失敗状態、終了コード、直近ログ |
| 2 | journalctl -xeu your.service |
systemdが補足したエラー文脈 |
| 3 | journalctl -u your.service -b -e |
現在の起動以降の末尾ログ |
| 4 | systemctl cat your.service |
実際に読み込まれているUnit定義 |
| 5 | systemctl list-dependencies your.service |
依存Unitの状態 |
この記事は、systemdを採用しているLinuxディストリビューションを前提にしています。
ディストリビューションやバージョンによって、Unitファイルの配置場所や一部の挙動が異なる場合があります。
まず覚えるコマンド
サービスを見るときに、まず使うのはこのあたりです。
| やりたいこと | コマンド |
|---|---|
| サービス状態を見る | systemctl status nginx.service |
| サービスを起動する | sudo systemctl start nginx.service |
| サービスを停止する | sudo systemctl stop nginx.service |
| サービスを再起動する | sudo systemctl restart nginx.service |
| 設定だけ再読み込みする | sudo systemctl reload nginx.service |
| 自動起動を有効化する | sudo systemctl enable nginx.service |
| 自動起動を無効化する | sudo systemctl disable nginx.service |
| 自動起動状態を見る | systemctl is-enabled nginx.service |
| 起動中かだけ見る | systemctl is-active nginx.service |
| ログを見る | journalctl -u nginx.service |
| ログを追いかける | journalctl -u nginx.service -f |
| 失敗状態を解除する | sudo systemctl reset-failed nginx.service |
.service は省略できることも多いです。
systemctl status nginx
ただ、チートシートや手順書では .service まで書いておく方が、Unitを扱っていることが明確になります。
最短の確認順
サービスが起動しないときは、まずこの順番で確認します。
systemctl status your.service
journalctl -xeu your.service
journalctl -u your.service -b -e
systemctl cat your.service
それぞれの役割です。
| コマンド | 見ること |
|---|---|
systemctl status |
失敗状態、終了コード、直近ログ |
journalctl -xeu |
systemdが補足したエラー文脈 |
journalctl -u ... -b -e |
現在の起動以降の末尾ログ |
systemctl cat |
実際に読み込まれているUnit定義 |
まず status で状態を見て、原因が分からなければ journalctl でログを深掘りします。
Unitファイルを編集した覚えがある場合は、 systemctl cat で実際に読み込まれている定義を確認します。
statusで見ること
まずは status を見ます。
systemctl status nginx.service
見るポイントは次の通りです。
| 見るところ | 意味 |
|---|---|
Loaded |
Unitファイルが読み込まれているか、自動起動設定はどうか |
Active |
起動中か、失敗しているか |
Main PID |
メインプロセスのPID |
Docs |
関連ドキュメントが設定されている場合の参照先 |
| 下部のログ | 直近のログ |
よく見る状態です。
| 状態 | 意味 |
|---|---|
active (running) |
起動中 |
inactive (dead) |
停止中 |
failed |
起動失敗などで失敗状態 |
activating |
起動処理中 |
deactivating |
停止処理中 |
status の下部に出るログは直近分だけです。
原因調査では、 journalctl -u <unit> でログを追う方が確実です。
ログを見る
対象サービスのログを見るには、 journalctl -u を使います。
journalctl -u nginx.service
末尾から見るなら -e を付けます。
journalctl -u nginx.service -e
リアルタイムに追うなら -f です。
journalctl -u nginx.service -f
現在の起動以降のログだけを見るなら -b を使います。
journalctl -u nginx.service -b
時刻で絞ることもできます。
journalctl -u nginx.service --since "2026-07-06 10:00" --until "2026-07-06 11:00"
ログをページャなしで出したい場合は --no-pager を付けます。
journalctl -u nginx.service -b --no-pager
サービスが起動しないときの確認順
サービスが起動しないときは、闇雲に設定ファイルを触るより、次の順番で見ます。
systemctl status your.service
journalctl -xeu your.service
journalctl -u your.service -b -e
systemctl cat your.service
systemctl show your.service
見る観点です。
| 順番 | コマンド | 確認すること |
|---|---|---|
| 1 | systemctl status |
失敗状態、終了コード、直近ログ |
| 2 | journalctl -xeu |
systemdが補足するエラー文脈 |
| 3 | journalctl -u |
エラー全文、起動時刻、繰り返し失敗 |
| 4 | systemctl cat |
実際に読み込まれているUnit定義 |
| 5 | systemctl show |
展開後のプロパティ |
| 6 | アプリ側の設定確認 | Nginx設定、DB接続、環境変数など |
systemctl cat は、Unitファイル本体とdrop-in設定をまとめて確認できるので便利です。
systemctl cat nginx.service
失敗状態を解除したい場合は、 reset-failed を使います。
sudo systemctl reset-failed your.service
reset-failed は失敗状態の記録を消すだけで、根本原因を直すコマンドではありません。
ログを確認し、原因を修正してから使います。
Unit一覧を見る
現在systemdが把握しているUnitを一覧します。
systemctl list-units
失敗しているUnitだけを見るなら次の通りです。
systemctl --failed
Unitファイルの一覧と自動起動状態を見るなら、 list-unit-files を使います。
systemctl list-unit-files
サービスだけに絞るなら、 --type=service を付けます。
systemctl list-units --type=service
systemctl list-unit-files --type=service
list-units は現在ロードされているUnitを見るコマンド、 list-unit-files はUnitファイルと有効化状態を見るコマンド、と覚えると使い分けやすいです。
自動起動を設定する
サービスを今すぐ起動するだけなら start です。
sudo systemctl start nginx.service
OS起動時にも自動起動させるなら enable です。
sudo systemctl enable nginx.service
両方まとめて行うなら --now が使えます。
sudo systemctl enable --now nginx.service
逆に、自動起動を止めて、今動いているサービスも止めるなら次のようにします。
sudo systemctl disable --now nginx.service
Unitファイルを編集した後
Unitファイルを変更した後は、systemdに再読み込みさせます。
sudo systemctl daemon-reload
その後、対象サービスを再起動します。
sudo systemctl restart your.service
Unitファイルの構文を確認するには、 systemd-analyze verify が使えます。
systemd-analyze verify your.service
Unitファイルを編集しただけでは、systemdが変更を認識しないことがあります。
Unit定義を変えたら、 systemctl daemon-reload を実行します。
Unitファイルの配置場所
よく見る配置場所です。
| パス | 用途 |
|---|---|
/usr/lib/systemd/system/ |
パッケージが提供するUnitファイル |
/lib/systemd/system/ |
ディストリビューションによって使われるUnitファイル |
/etc/systemd/system/ |
管理者が追加・上書きするUnitファイル |
/etc/systemd/system/<unit>.d/ |
drop-in設定 |
自分でサービスを追加するなら、基本的には /etc/systemd/system/ 配下に置きます。
パッケージが提供するUnitを直接編集するより、drop-inで上書きする方が管理しやすいです。
sudo systemctl edit nginx.service
サービスUnitの最小例
自作スクリプトをsystemdで起動する最小例です。
[Unit]
Description=My Worker
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/my-worker
ExecStart=/usr/bin/python3 /opt/my-worker/main.py
Restart=on-failure
User=myuser
Group=myuser
[Install]
WantedBy=multi-user.target
配置例です。
sudo cp my-worker.service /etc/systemd/system/my-worker.service
sudo systemctl daemon-reload
sudo systemctl enable --now my-worker.service
ログを確認します。
systemctl status my-worker.service
journalctl -u my-worker.service -f
タイマーを確認する
cronのような定期実行は、systemd timerで管理されていることがあります。
systemctl list-timers
全て表示するなら --all を付けます。
systemctl list-timers --all
特定のtimerを見るなら、通常のUnitと同じように status を使えます。
systemctl status apt-daily.timer
システム状態を変える
サーバー操作で使うことがあるコマンドです。
| やりたいこと | コマンド |
|---|---|
| 再起動 | sudo systemctl reboot |
| 電源オフ | sudo systemctl poweroff |
| デフォルトターゲットへ戻る | sudo systemctl default |
| emergency modeへ入る | sudo systemctl emergency |
| 現在のデフォルトターゲットを見る | systemctl get-default |
| デフォルトターゲットを変更する | sudo systemctl set-default multi-user.target |
reboot 、 poweroff 、 emergency はシステム全体に影響します。
リモートサーバーで実行する場合は、接続復旧手段があることを確認してから実行します。
よく使う調査コマンドまとめ
最後に、実際によく使うコマンドをまとめます。
# 状態確認
systemctl status your.service
systemctl is-active your.service
systemctl is-enabled your.service
# 起動・停止
sudo systemctl start your.service
sudo systemctl stop your.service
sudo systemctl restart your.service
sudo systemctl reload your.service
# 自動起動
sudo systemctl enable --now your.service
sudo systemctl disable --now your.service
# ログ
journalctl -u your.service -b -e
journalctl -u your.service -f
journalctl -u your.service --since "1 hour ago"
# Unit確認
systemctl cat your.service
systemctl show your.service
systemctl list-units --type=service
systemctl list-unit-files --type=service
systemctl --failed
# Unit変更後
sudo systemctl daemon-reload
systemd-analyze verify your.service