systemctl の使い方 - status・start・restart・enable でサービス管理

systemctl の使い方 - status・start・restart・enable でサービス管理

この記事でできるようになること

  • systemctl status でサービスの状態を読み取れる
  • start・stop・restart・reload を安全に使い分けられる
  • enable と start の違いを理解して自動起動を設定できる

前提知識(先に読むと理解しやすい記事)

この記事で解決できること

  • systemctl status の出力から、サービスが動いているかどうかを読み取れます。
  • start / stop / restart / reload を、影響を理解したうえで使い分けられます。
  • enablestart の違いを理解し、自動起動を意図どおりに設定できます。

結論(最短)

まずはこれだけ覚えれば現場で困りません。

  • 状態確認: systemctl status <service>
  • 起動: systemctl start <service>
  • 停止: systemctl stop <service>
  • 再起動: systemctl restart <service>
  • 設定を読み直して再起動: systemctl reload <service>(対応していれば)
  • 自動起動ON: systemctl enable <service>
  • 自動起動OFF: systemctl disable <service>

Ubuntuでは多くの場合、管理者権限が必要なので sudo を付けます。sudo は「このコマンドだけ管理者として実行する」という仕組みです。

前提(対象環境)

  • OS:Ubuntu
  • systemd を使用している環境
  • 権限:sudo が使える想定

1. systemctl とは?

結論: systemctl は systemd のサービス管理コマンドで、起動・停止・再起動・状態確認を一手に担う。

systemctl は systemd のサービス管理コマンドです。 サーバ上で動いているサービス(例:nginx, apache2, ssh, docker など)を、起動/停止/再起動/状態確認できます。

先に用語を 4 つだけ整理します。

用語 一行の意味 補足
systemd Linux の起動処理とサービスを管理する仕組み 「init システム」と呼ばれることもあります
デーモン(daemon) 画面を持たず、裏で動き続けるプログラム 「常駐プロセス」とも呼ばれます
サービス(service) systemd が管理する単位から見たデーモンの呼び名 この記事では「サービス」で統一します
ユニット(unit) systemd が管理する対象の総称 サービスはユニットの一種で、名前は nginx.service の形です

「デーモン」「サービス」「ユニット」は現場で混ざって使われます。 systemctl の操作対象はすべてユニットです。サービスはユニットの一種なので、nginxnginx.service はどちらを書いても同じ意味になります。

2. まずは「状態確認」から(status)

結論: 障害対応は systemctl status から始め、active / inactive / failed のどれかを最初に見極める。

障害対応はまずここから始めます。 status は状態を読むだけのコマンドです。サービスを止めたり動かしたりはしないので、安全に何度でも実行できます。

$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-12-15 10:12:03 UTC; 2h 5min ago
   Main PID: 1234 (nginx)
      Tasks: 3 (limit: 4610)
     Memory: 5.6M
     CGroup: /system.slice/nginx.service
             ├─1234 nginx: master process /usr/sbin/nginx -g daemon on;
             └─1235 nginx: worker process

よく見るポイント:

  • Active: active (running) → 動いている
  • Active: inactive (dead) → 止まっている
  • Active: failed → 失敗している(原因調査が必要)
  • Loaded: loaded (...; enabled; ...)enabled / disabled → 自動起動の設定(後述の §5)

Active: は「今」の状態、Loaded: 行の enabled は「次回サーバを起動したとき」の設定です。 この 2 つは独立しているので、status 一発で両方を読み取ってください。

failed の場合は、後述の journalctl -u でログを見るのが最短です。

3. 起動・停止・再起動(start/stop/restart)

結論: start / stop / restart でサービスを操作し、設定変更後は基本 restart で反映する。

ここからはサーバの状態を実際に変えるコマンドです。 何が変わるか戻し方を先に確認してください。

コマンド 実行すると何が変わるか 戻し方 安全に試す方法
start 止まっていたサービスが動き出す stop で止める 先に status で現状を控える
stop そのサービスの機能が即座に止まる(Web なら閲覧不可) start で戻す 利用者がいない時間帯に実施する
restart 一瞬止まってから起動し直す(短時間の停止が発生) 設定を戻して再度 restart 先に構文チェック(後述)を通しておく

3-1. 起動

$ sudo systemctl start nginx

3-2. 停止

$ sudo systemctl stop nginx

stop は実行した瞬間にサービスが止まります。 本番サーバでは「今このサービスを止めて誰が困るか」を確認してから実行してください。 止めてしまった場合は sudo systemctl start <service> で元に戻せます。

3-3. 再起動

$ sudo systemctl restart nginx

設定を直した後は基本 restart。 reload対応なら reload で"落とさずに"反映できる場合もあります。

4. reload / reload-or-restart(設定反映の扱い)

結論: reload は無停止反映だが非対応のサービスもあり、迷うなら reload-or-restart が安全。

reload は「サービスを止めずに設定ファイルだけ読み直す」操作です。 すべてのサービスが対応しているわけではありません。

4-1. reload(対応しているサービスのみ)

$ sudo systemctl reload nginx

4-2. reload-or-restart(迷うならこれが安全)

$ sudo systemctl reload-or-restart nginx
  • reload対応なら reload
  • 対応していなければ restart

4-3. reload と daemon-reload は別物

名前が近く、最も混同される組み合わせです。読み直す対象がまったく違います。

コマンド 読み直す対象 使う場面
systemctl reload <service> サービス自身の設定(nginx.conf 等) 設定ファイルを直した後
systemctl daemon-reload systemd の unit ファイル(*.service unit ファイルを直した後

unit ファイル(/etc/systemd/system/*.service 等)を編集したのに restart だけで反映されない場合は、これが原因です。

$ sudo systemctl daemon-reload
$ sudo systemctl restart nginx

daemon-reload は systemd に定義を読み直させるだけで、サービスの再起動は行いません。反映には restart が別途必要です。

5. 自動起動(enable/disable)※新人が詰まりやすいポイント

結論: enable は次回起動時の自動起動設定であり、今すぐ動かす start とは別物なので両方必要。

「今は動いてるけど、再起動したら落ちる」問題はここです。

enabledisable が変えるのは「次回サーバを起動したときに自動で立ち上がるか」だけです。 今動いているサービスには影響しません。

5-1. 自動起動をON

$ sudo systemctl enable nginx

5-2. 自動起動をOFF

$ sudo systemctl disable nginx

disable したことを忘れると、次回のサーバ再起動でサービスが上がらず障害になります。 戻すときは sudo systemctl enable <service> を実行してください。 現在の設定は systemctl is-enabled <service> で読み取り専用に確認できます。

5-3. 自動起動状態を確認

$ systemctl is-enabled nginx
enabled

出力例の意味:

  • enabled:自動起動ON
  • disabled:自動起動OFF

6. "動かない"ときの定番手順(障害対応の型)

結論: status で確認し、failed ならログを読み、設定起因なら構文チェック後に restart する。

6-1. statusで状態確認

$ sudo systemctl status nginx

6-2. failedならログを見る(これが最短)

$ sudo journalctl -u nginx -n 200

journalctl は systemd が集めたログを読むコマンドです。 -u は「このユニットのログだけ」、-n 200 は「直近 200 行だけ」という指定です。

リアルタイム追跡:

$ sudo journalctl -u nginx -f

6-3. 設定ミスの可能性が高いなら(例:nginx)

サービス固有の構文チェックがある場合は先に実行:

$ sudo nginx -t

nginx -t は設定ファイルを読むだけで、サービスの動作は変えません。

設定が壊れている状態で restart すると、止まったままになることがあります。 まずは構文チェック → OKなら restart が安全です。

7. サービス名(unit名)が分からない時

結論: サービス名は環境差があるため systemctl list-units --type=service を grep で絞って特定する。

サービス名は環境で微妙に違います(例:Ubuntuだと Apache は apache2 が多い)。

一覧から探す:

$ systemctl list-units --type=service | grep -i apache

全部表示(多いので注意):

$ systemctl list-units --type=service

list-units は一覧を表示するだけのコマンドです。サービスの状態は変わりません。

8. よくあるつまずき

結論: 起動中でも接続不可ならポートや FW を疑い、enable しただけでは今すぐ起動しない点に注意する。

8-1. statusは「起動してるのに」アクセスできない

サービスが起動していても、ポート待受やFW、アプリ側エラーで繋がらないことがあります。 FW(ファイアウォール)は通信を許可・遮断する仕組みで、Ubuntu では ufw が使われることが多いです。 「ポート疎通(ss/lsof/nc/curl)」とセットで切り分けると早いです。

8-2. enableしたのに起動してない

enable は「次回起動時に自動起動する設定」です。 今すぐ起動したいなら start も必要です。

$ sudo systemctl enable nginx
$ sudo systemctl start nginx

9. 作業完了チェックリスト

結論: 操作後は状態・自動起動・ログの 3 点を読み取り専用コマンドで確認し、想定どおりかを突き合わせる。

  • [ ] systemctl status <service>active (running) になっている
  • [ ] systemctl is-enabled <service> が意図した値(enabled / disabled)になっている
  • [ ] journalctl -u <service> -n 50 に新しいエラーが出ていない
  • [ ] 停止・再起動した場合、利用者から見て機能が戻っている

まとめ(コピペ用)

# 状態確認
sudo systemctl status <service>

# 起動/停止/再起動
sudo systemctl start <service>
sudo systemctl stop <service>
sudo systemctl restart <service>

# 設定反映(対応していれば)
sudo systemctl reload <service>
sudo systemctl reload-or-restart <service>

# 自動起動
sudo systemctl enable <service>
sudo systemctl disable <service>
systemctl is-enabled <service>

# ログ
sudo journalctl -u <service> -n 200
sudo journalctl -u <service> -f

次に読む