メインコンテンツへスキップ
中級10分で読める

systemctlでサービス管理

Linuxのsystemctlコマンドを使って、システムサービスの起動・停止・管理を行う方法を実例を交えて詳しく解説します。

システム編systemctlsystemdサービス管理デーモン起動設定

🎯 この記事で学べること

  • 1
    `systemctl`コマンドの基本的な使い方をマスターできます
  • 2
    サービスの起動・停止・再起動の操作方法がわかります
  • 3
    システム起動時の自動起動設定(enable/disable)を理解できます
  • 4
    ユニットファイルの作成とカスタマイズ方法が身につきます
  • 5
    journalctlと連携したログ確認とトラブルシューティングができるようになります

読了時間: 約10

systemctlとは

みなさん、Webサーバーやデータベースなどのサービスを手動で起動・停止していませんか?システム起動時に自動的にサービスを開始したいと思ったことはありませんか?

systemctlは、systemd(システムデーモン)を使用するLinuxディストリビューションで、システムサービスとユニットを管理するための強力なコマンドです。これを使えば、サービスの起動・停止、自動起動の設定、状態確認など、システム管理に必要な操作を簡単に行えるんです!

今回は、システム管理の要となるsystemctlの使い方を、実践的な例を交えながら学んでいきましょう!

systemdの基本概念

ユニットとは

systemdでは、管理対象を「ユニット」と呼びます。これがsystemdの基本単位なんですね!

主なユニットタイプを見てみましょう:

  • service - システムサービス(最も一般的、nginxやsshdなど)
  • socket - ソケット(ネットワーク接続の待ち受け)
  • device - デバイス(ハードウェアデバイス)
  • mount - マウントポイント(ファイルシステムのマウント)
  • automount - 自動マウントポイント(アクセス時に自動マウント)
  • target - ユニットのグループ(旧runlevelに相当)
  • timer - タイマーベースの実行(cronの代替)
# systemdユニットタイプの例
echo 'nginx.service - Webサーバー'
echo 'ssh.socket - SSHソケット'
echo 'multi-user.target - マルチユーザーターゲット'

基本的な使い方

サービスの状態確認

まずは、サービスの状態を確認する方法から見ていきましょう!

# 特定サービスの状態を確認
$ systemctl status nginx

# すべてのサービス一覧
$ systemctl list-units --type=service

# 実行中のサービスのみ表示
$ systemctl list-units --type=service --state=running

出力例:

● nginx.service - A high performance web server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: active (running) since Mon 2025-08-08 10:00:00 JST
   Main PID: 1234 (nginx)

statusコマンドでは、サービスの有効/無効状態(enabled/disabled)、実行状態(active/inactive)、プロセスID、最近のログなどが表示されます。これらの情報がトラブルシューティングに役立ちますよ!

サービスの起動・停止

次に、サービスを実際に操作してみましょう。とても簡単ですよ!

# サービスを起動
$ sudo systemctl start nginx

# サービスを停止
$ sudo systemctl stop nginx

# サービスを再起動
$ sudo systemctl restart nginx

# 設定ファイルを再読み込み(サービスを停止せずに)
$ sudo systemctl reload nginx

reloadは設定ファイルだけを再読み込みするので、サービスを停止せずに設定変更を反映できます。Webサーバーなど、停止できないサービスで便利ですね!

自動起動の設定

システム起動時にサービスを自動的に開始したい場合の設定方法です。これは非常に重要な機能ですね!

# 自動起動を有効化(システム起動時に自動的に開始)
$ sudo systemctl enable nginx

# 自動起動を無効化
$ sudo systemctl disable nginx

# 現在の自動起動設定を確認
$ systemctl is-enabled nginx

# 有効化と起動を同時に実行(便利!)
$ sudo systemctl enable --now nginx

--nowオプションを使うと、enableとstartを同時に実行できます。これでコマンドを2回打つ必要がなくなりますよ!

サービスの詳細確認

サービスの依存関係

サービスは他のサービスやターゲットに依存していることがあります。この依存関係を確認してみましょう!

# サービスの依存関係を表示
$ systemctl list-dependencies nginx

# 逆依存関係(このサービスに依存するもの)
$ systemctl list-dependencies nginx --reverse

# すべての依存関係をツリー表示
$ systemctl list-dependencies

出力例:

nginx.service
├─network.target
├─remote-fs.target
└─system.slice

これで、nginxがネットワークとリモートファイルシステムに依存していることがわかりますね!

サービスのプロパティ

# サービスの全プロパティを表示
$ systemctl show nginx

# 特定のプロパティのみ表示
$ systemctl show nginx -p MainPID
$ systemctl show nginx -p ActiveState
$ systemctl show nginx -p SubState

ユニットファイルの管理

ユニットファイルの場所

サービスの動作はユニットファイルで定義されています。このファイルを確認・編集する方法を学びましょう!

# ユニットファイルの場所を確認
$ systemctl cat nginx.service

# ユニットファイルの編集(オーバーライドファイルを作成)
$ sudo systemctl edit nginx.service

# 編集内容を破棄して元に戻す
$ sudo systemctl revert nginx.service

systemctl editは元のファイルを直接編集せず、オーバーライドファイルを作成します。これで安全にカスタマイズできますよ!

ユニットファイルの構造

ユニットファイルは3つのセクションで構成されています:

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

各セクションの役割:

  • [Unit] - サービスの説明と依存関係
  • [Service] - サービスの実行方法
  • [Install] - 自動起動の設定

実践的な使い方

新しいサービスの作成

独自のアプリケーションをサービスとして登録してみましょう!これができるようになると、システム管理が格段に楽になりますよ!

# カスタムサービスファイルを作成
$ sudo nano /etc/systemd/system/myapp.service

以下のような内容でファイルを作成します:

[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
User=myapp
Group=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

次に、サービスを有効化して起動します:

# systemdに新しいサービスを認識させる
$ sudo systemctl daemon-reload

# サービスを起動
$ sudo systemctl start myapp

# 自動起動を有効化
$ sudo systemctl enable myapp

Restart=alwaysを設定すると、プロセスが異常終了しても自動的に再起動されます。安定したサービス運用に必須の設定ですね!

サービスの監視と自動再起動

[Service]
# 異常終了時の自動再起動
Restart=on-failure
RestartSec=5s

# 再起動の最大試行回数
StartLimitBurst=3
StartLimitIntervalSec=60s

# メモリ制限
MemoryLimit=512M

# CPU使用率制限
CPUQuota=50%

タイマーユニットの使用

# タイマーユニットの作成(cronの代替)
$ sudo nano /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
# タイマーの有効化と起動
$ sudo systemctl enable --now backup.timer

# タイマーの一覧表示
$ systemctl list-timers

ログの確認

journalctlとの連携

systemdはjournaldというログシステムと統合されています。journalctlコマンドでサービスのログを簡単に確認できるんです!

# サービスのログを表示
$ journalctl -u nginx

# 最新のログをフォロー(リアルタイム監視)
$ journalctl -u nginx -f

# 特定期間のログ
$ journalctl -u nginx --since "2025-08-08 10:00:00"
$ journalctl -u nginx --since "1 hour ago"

# エラーログのみ表示
$ journalctl -u nginx -p err

出力例:

Aug 08 10:00:00 server systemd[1]: Starting nginx.service...
Aug 08 10:00:01 server nginx[1234]: nginx: configuration file test successful
Aug 08 10:00:01 server systemd[1]: Started nginx.service.

-fオプションを使うと、新しいログエントリがリアルタイムで表示されます。トラブルシューティング時に非常に便利ですよ!

システムターゲットの管理

ランレベルとターゲット

# 現在のターゲットを確認
$ systemctl get-default

# デフォルトターゲットを変更
$ sudo systemctl set-default multi-user.target

# 利用可能なターゲット一覧
$ systemctl list-units --type=target

# 特定のターゲットに切り替え
$ sudo systemctl isolate multi-user.target

主要なターゲット

  • poweroff.target - システムシャットダウン
  • rescue.target - レスキューモード
  • multi-user.target - マルチユーザーモード(CUI)
  • graphical.target - グラフィカルモード(GUI)
  • reboot.target - システム再起動

トラブルシューティング

サービスが起動しない場合

サービスが起動しない時は、落ち着いて順番に原因を調べていきましょう!

# 詳細なステータス確認
$ systemctl status -l nginx

# 失敗したサービスの一覧
$ systemctl list-units --failed

# サービスの起動失敗理由を確認
$ journalctl -xe -u nginx

# 設定ファイルの検証
$ sudo nginx -t

依存関係の問題

依存関係が原因で起動しないこともあります。以下の方法で調査できます:

# 依存関係の確認
$ systemctl list-dependencies nginx

# 起動順序の確認(SVGファイルで視覚化)
$ systemd-analyze plot > bootup.svg

# 起動時間の分析(遅いサービスを特定)
$ systemd-analyze blame

サービスが起動しない最も一般的な原因は、設定ファイルのエラーです。まずはアプリケーション固有の設定ファイルをチェックしましょう!

セキュリティ設定

サービスの隔離

[Service]
# プライベート/tmpディレクトリ
PrivateTmp=true

# 読み取り専用のルートファイルシステム
ReadOnlyPaths=/

# 書き込み可能なパス
ReadWritePaths=/var/lib/myapp

# ネットワークの隔離
PrivateNetwork=true

# システムコールのフィルタリング
SystemCallFilter=@basic-io @network-io

リソース制限

[Service]
# メモリ制限
MemoryLimit=1G
MemoryAccounting=true

# CPU制限
CPUQuota=50%
CPUAccounting=true

# ファイルディスクリプタ制限
LimitNOFILE=65536

# プロセス数制限
LimitNPROC=4096

高度な機能

ソケットアクティベーション

# ソケットユニットの作成
$ sudo nano /etc/systemd/system/myapp.socket
[Unit]
Description=My App Socket

[Socket]
ListenStream=8080

[Install]
WantedBy=sockets.target

テンプレートユニット

# テンプレートサービスの作成
$ sudo nano /etc/systemd/system/myapp@.service
[Unit]
Description=My App Instance %i

[Service]
Type=simple
ExecStart=/usr/bin/myapp --instance=%i
Restart=always

[Install]
WantedBy=multi-user.target
# インスタンスの起動
$ sudo systemctl start myapp@1
$ sudo systemctl start myapp@2
$ sudo systemctl enable myapp@{1..3}

ベストプラクティス

サービスファイルの書き方

[Unit]
# わかりやすい説明を記載
Description=Production Web Application

# 適切な依存関係を設定
After=network.target postgresql.service
Requires=postgresql.service

[Service]
# 適切なタイプを選択
Type=notify

# セキュリティ設定
User=webapp
Group=webapp
NoNewPrivileges=true

# 環境変数
Environment="NODE_ENV=production"
EnvironmentFile=/etc/myapp/environment

# 再起動ポリシー
Restart=on-failure
RestartSec=5s

# リソース制限
MemoryLimit=2G
CPUQuota=200%

[Install]
WantedBy=multi-user.target

監視とアラート

#!/bin/bash
# service_monitor.sh

SERVICE="nginx"
EMAIL="admin@example.com"

if ! systemctl is-active --quiet $SERVICE; then
    echo "Service $SERVICE is not running" | mail -s "Service Alert" $EMAIL
    systemctl start $SERVICE
fi

# 自動再起動の失敗を検知
if systemctl is-failed --quiet $SERVICE; then
    echo "Service $SERVICE has failed" | mail -s "Service Failed" $EMAIL
fi

コマンドリファレンス

よく使うコマンド一覧

# サービス管理
systemctl start/stop/restart/reload SERVICE
systemctl enable/disable SERVICE
systemctl status SERVICE
systemctl is-active/is-enabled SERVICE

# システム管理
systemctl daemon-reload
systemctl reboot/poweroff/suspend/hibernate

# 情報表示
systemctl list-units
systemctl list-unit-files
systemctl list-dependencies
systemctl show SERVICE

# ログ確認
journalctl -u SERVICE
journalctl -f
journalctl --since "TIME"

🎮 理解度チェック

システム起動時にサービスを自動的に開始するコマンドは?
サービスのログをリアルタイムで監視するコマンドは?
ユニットファイルを編集した後、systemdに変更を認識させるコマンドは?

📝 まとめ

今回はsystemctlコマンドについて学びました!

  • systemctlはsystemdベースのLinuxでサービスを管理する中核ツール
  • start/stop/restart/reloadでサービスの基本操作ができる
  • enable/disableでシステム起動時の自動起動を制御する
  • ユニットファイルでサービスの動作を詳細に定義できる
  • journalctlと連携してログの確認とトラブルシューティングが可能

次はSSHコマンドで、リモートサーバーへの安全な接続方法を学びましょう!