Linuxでは「Apache」「MySQL」「SSH」などのサーバープログラムを サービス(デーモン) として管理します。
現代のLinuxディストリビューション(Ubuntu、CentOS、Debian など)では、systemd がサービスを管理しており、
systemctl コマンドでその操作を行います。
systemd とは?
systemd は Linux の初期化システム(init system)です。 OS が起動するとき、最初に立ち上がるプロセス(PID 1)として動作し、 その後のサービスの起動・管理をすべて担当します。
systemctl は systemd を操作するためのコマンドラインツールです。
サービスの状態を確認する
まず、サービスの現在の状態を確認する方法から始めましょう。
# サービスの状態を確認
systemctl status <サービス名>
# 例:SSHサービスの状態を確認
systemctl status ssh
実行すると、以下のような情報が表示されます。
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2026-07-23 09:00:00 JST; 2h 30min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1234 (sshd)
Tasks: 1 (limit: 4915)
Memory: 2.5M
CPU: 12ms
CGroup: /system.slice/ssh.service
└─1234 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
ポイントとなる行の見方:
Active: active (running)→ サービスが動いているActive: inactive (dead)→ サービスが停止しているActive: failed→ エラーで停止しているenabled→ OS起動時に自動で起動する設定になっているdisabled→ OS起動時に自動起動しない設定
サービスを起動・停止する
# サービスを起動
sudo systemctl start <サービス名>
# サービスを停止
sudo systemctl stop <サービス名>
# サービスを再起動(停止→起動)
sudo systemctl restart <サービス名>
# 設定ファイルを再読み込み(停止せずに設定を反映)
sudo systemctl reload <サービス名>
注意:
start/stop/restartなどは root 権限が必要なためsudoが必要です。
実例として nginx(Webサーバー)を操作する場合:
# nginx を起動
sudo systemctl start nginx
# nginx の状態を確認
systemctl status nginx
# nginx を停止
sudo systemctl stop nginx
# 設定を変更した後、停止せずに反映
sudo systemctl reload nginx
自動起動の設定
OS の起動時にサービスを自動的に起動させるかどうかを設定できます。
# 自動起動を有効化(OS起動時に自動で立ち上がるようになる)
sudo systemctl enable <サービス名>
# 自動起動を無効化
sudo systemctl disable <サービス名>
# 有効化と同時に今すぐ起動
sudo systemctl enable --now <サービス名>
# 無効化と同時に今すぐ停止
sudo systemctl disable --now <サービス名>
enable と start の違いに注意しましょう。
| コマンド | 効果 |
|---|---|
start | 今すぐ起動(次回のOS再起動後は起動しない) |
enable | 次回のOS起動時から自動起動(今は起動しない) |
enable --now | 今すぐ起動 + 次回以降も自動起動 |
自動起動の状態を確認する
# 自動起動が有効かどうかだけを確認
systemctl is-enabled <サービス名>
# → enabled または disabled と表示される
# 現在動いているかどうかを確認
systemctl is-active <サービス名>
# → active または inactive と表示される
スクリプト内でサービスの状態に応じて処理を分岐したいときに便利です。
if systemctl is-active --quiet nginx; then
echo "nginx は動作中です"
else
echo "nginx は停止しています"
fi
全サービスの一覧を見る
# 動作中のサービス一覧
systemctl list-units --type=service --state=running
# 失敗したサービス一覧
systemctl list-units --type=service --state=failed
# すべてのサービス一覧(有効・無効・停止中も含む)
systemctl list-unit-files --type=service
list-unit-files は自動起動設定の一覧を見るのに便利です。
systemctl list-unit-files --type=service | grep enabled
これで、自動起動が有効になっているサービスだけを絞り込めます。
ログを確認する(journalctl)
systemd のサービスのログは journalctl コマンドで確認できます。
# 特定サービスのログを表示
journalctl -u <サービス名>
# リアルタイムでログを追いかける(tail -f に相当)
journalctl -u <サービス名> -f
# 最新の50行だけ表示
journalctl -u <サービス名> -n 50
# 今日のログだけ表示
journalctl -u <サービス名> --since today
サービスが起動しない場合は、まず journalctl でエラーログを確認するのが基本です。
# エラー時の調査手順
sudo systemctl start nginx # 起動を試みる(失敗する場合)
journalctl -u nginx -n 30 # 直近のログでエラー原因を確認
よく使うコマンドまとめ
# ステータス確認
systemctl status nginx
# 起動・停止・再起動
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
# 自動起動の設定
sudo systemctl enable nginx
sudo systemctl disable nginx
# ログ確認
journalctl -u nginx -n 50
journalctl -u nginx -f # リアルタイム追跡
練習問題
問題1
SSH サービス(サービス名: ssh または sshd)について、以下の情報を systemctl status で確認してください。
- 現在動作しているか
- OS起動時に自動起動する設定になっているか
どのコマンドを実行しますか?
問題2
以下のシナリオに適切なコマンドを答えてください。
「nginx をインストールしたばかりで、今すぐ起動させたい。かつ、次にサーバーを再起動したときも自動的に nginx が起動してほしい。」
コマンドを1行または2行で答えてください。
問題3
次のスクリプトの空欄を埋めてください。
#!/bin/bash
SERVICE="mysql"
# mysql が動作していない場合は起動する
if ! _______1_______ --quiet "$SERVICE"; then
echo "$SERVICE が停止しています。起動します..."
sudo _______2_______ "$SERVICE"
fi
echo "$SERVICE の状態:"
_______3_______ "$SERVICE"
解答
問題1の解答
systemctl status ssh
出力の中の以下の行を確認します。
Active: active (running)→ 動作中Loaded: ... enabled→ 自動起動が有効
ディストリビューションによっては ssh の代わりに sshd を使う場合があります(CentOS/RHEL系)。
# Ubuntu/Debian系
systemctl status ssh
# CentOS/RHEL系
systemctl status sshd
問題2の解答
方法1(2行):
sudo systemctl start nginx
sudo systemctl enable nginx
方法2(1行):
sudo systemctl enable --now nginx
enable --now は「有効化して今すぐ起動」を1コマンドでできます。
問題3の解答
#!/bin/bash
SERVICE="mysql"
# mysql が動作していない場合は起動する
if ! systemctl is-active --quiet "$SERVICE"; then
echo "$SERVICE が停止しています。起動します..."
sudo systemctl start "$SERVICE"
fi
echo "$SERVICE の状態:"
systemctl status "$SERVICE"
systemctl is-activeでサービスが動作中かチェックsystemctl startでサービスを起動systemctl statusでサービスの詳細な状態を表示
--quiet オプションをつけると終了ステータスだけを返し、余分な出力をしないため、if 文との組み合わせに適しています。