systemctl の使い方 - status・start・restart・enable でサービス管理
この記事でできるようになること
- systemctl status でサービスの状態を読み取れる
- start・stop・restart・reload を安全に使い分けられる
- enable と start の違いを理解して自動起動を設定できる
前提知識(先に読むと理解しやすい記事)
この記事で解決できること
systemctl statusの出力から、サービスが動いているかどうかを読み取れます。start/stop/restart/reloadを、影響を理解したうえで使い分けられます。enableとstartの違いを理解し、自動起動を意図どおりに設定できます。
結論(最短)
まずはこれだけ覚えれば現場で困りません。
- 状態確認:
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 の操作対象はすべてユニットです。サービスはユニットの一種なので、nginx と nginx.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 とは別物なので両方必要。
「今は動いてるけど、再起動したら落ちる」問題はここです。
enable と disable が変えるのは「次回サーバを起動したときに自動で立ち上がるか」だけです。
今動いているサービスには影響しません。
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:自動起動ONdisabled:自動起動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