システム管理 初級

systemctlでサービスを管理する:Linux サービス管理の基本

systemdとsystemctlコマンドを使ってLinuxのサービスを起動・停止・自動起動設定する方法を、実例を交えてわかりやすく解説する

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 <サービス>

enablestart の違いに注意しましょう。

コマンド効果
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 で確認してください。

  1. 現在動作しているか
  2. 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"
  1. systemctl is-active でサービスが動作中かチェック
  2. systemctl start でサービスを起動
  3. systemctl status でサービスの詳細な状態を表示

--quiet オプションをつけると終了ステータスだけを返し、余分な出力をしないため、if 文との組み合わせに適しています。