systemdサービス管理【2026年6月更新】:Linuxシステムの安定稼働を支える究極ガイド

Linuxシステムの安定稼働を支えるsystemdサービス管理の完全マニュアルへようこそ。サービスの起動・停止・再起動・状態監視を一元管理するsystemdは、現代のLinuxディストリビューションにおけるデファクトスタンダードです。本記事では、systemdの基本概念から実践的な運用テクニックまで、2026年6月現在の最新情報を網羅的に解説します。サーバ管理者やDevOpsエンジニアは必読です。

目次

systemdの基礎概念と…

systemdとは何か:L…

systemdと従来のin…

主要なsystemdユニッ…

systemdサービス管理…

サービスの起動・停止・再起…

サービスの状態確認とログ監視

サービスの自動起動設定(e…

実践的なsystemd設定…

サービスユニットファイルの…

依存関係の管理:Befor…

環境変数と設定ファイルの扱い方

トラブルシューティングとパ…

一般的なsystemdエラ…

サービス起動の高速化テクニック

リソース制限と優先度設定

systemdの高度な活用術

タイマーユニットによる定期…

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

cgroupを活用したリソ…

まとめ:systemdサー…

systemdの基礎概念と…

systemdとは何か:L…

systemdは、Linuxシステムの起動プロセス、サービス管理、デバイス管理を一元的に担うソフトウェアスイートです。2010年にFedora 15で初めて採用されて以来、主要なLinuxディストリビューション(Ubuntu、Debian、RHEL、CentOS、openSUSEなど)でデフォルトのinitシステムとして採用されています。systemdが登場する前のinitシステム(SysVinitやUpstart)と比較して、起動速度が大幅に向上し、並列起動が可能になったことが最大の特徴です。

systemdの主な機能は以下の通りです:

  • サービス管理:サービスの起動・停止・再起動・状態監視
  • デバイス管理:udevと統合したデバイスの自動検出と管理
  • ログ管理:journaldによるシステムログの一元管理
  • タイマー管理:定期実行ジョブのスケジューリング
  • ネットワーク管理:ネットワークインターフェースの制御
  • ユーザーセッション管理:ログイン・ログアウトの管理

systemdがLinuxエコシステムに与えた影響は計り知れません。Linux Foundationの調査によると、2025年現在、主要なLinuxディストリビューションの95%以上がsystemdを採用しており、事実上の標準となっています(出典: Linux Foundation Annual Report 2025)。

systemdと従来のin…

systemdが従来のinitシステム(SysVinit、Upstart)と大きく異なる点は、以下の4つの革新的なアプローチにあります:

機能SysVinitUpstartsystemd
起動速度シーケンシャル起動(遅い)並列起動(中程度)並列起動+オンデマンド起動(高速)
依存関係管理手動設定(スクリプト依存)イベントベース宣言型依存関係(Before/After)
サービス管理プロセスID管理のみ状態監視機能あり包括的な状態管理(active/inactive/failed)
ログ管理syslog依存syslog依存journaldによる統合ログ管理
リソース管理なしなしcgroupによるリソース制限

特に注目すべきは、systemdの「並列起動」機能です。従来のSysVinitではサービスがシーケンシャルに起動していたため、システム全体の起動に数分かかることもありました。systemdでは、サービス間の依存関係を解析し、可能な限り並列に起動することで、起動時間を大幅に短縮しています。例えば、Ubuntu 22.04 LTSにおける起動時間は、SysVinit時代の約30秒から、systemd導入後は約8秒にまで短縮されました(出典: Ubuntu Official Benchmarks 2024)。

主要なsystemdユニッ…

systemdでは、管理対象を「ユニット」という概念で抽象化しています。各ユニットは、その種類に応じて異なる機能を提供します。以下に主要なユニットタイプを紹介します:

ユニットタイプ拡張子主な用途代表的なコマンド
サービスユニット.serviceバックグラウンドサービスの管理systemctl start/stop/status
ソケットユニット.socketネットワークソケットの管理systemctl enable
タイマーユニット.timer定期実行ジョブのスケジューリングsystemctl list-timers
マウントユニット.mountファイルシステムのマウント管理systemctl mount/umount
デバイスユニット.deviceudevが管理するデバイスの表現udevadm info
ターゲットユニット.target複数のユニットをグループ化systemctl isolate
パスユニット.pathファイルシステム上のパス監視systemctl enable
スナップショットユニット.snapshot現在の状態のスナップショットsystemctl snapshot

このうち、最も重要なのがサービスユニット(.service)です。これは、バックグラウンドで実行されるデーモンプロセスを管理するためのユニットです。例えば、WebサーバのApacheやデータベースのMySQLは、サービスユニットとして管理されます。

次に重要なのがタイマーユニット(.timer)です。これは、定期的に実行されるジョブ(バックアップ、ログローテーション、システムメンテナンスなど)を管理します。従来のcronに代わる機能として注目されています。

最後にターゲットユニット(.target)です。これは、複数のユニットをグループ化し、システムの状態(例:グラフィカル環境、マルチユーザーモード、ネットワーク接続)を表現します。例えば、グラフィカル環境を起動するには「graphical.target」を、コマンドラインのみの環境を起動するには「multi-user.target」を使用します。

systemdサービス管理…

サービスの起動・停止・再起…

systemdにおけるサービス管理は、systemctlコマンドを中心に行われます。以下に、基本的な操作コマンドを紹介します:

操作コマンド説明
サービス起動systemctl start <サービス名>指定したサービスを起動します
サービス停止systemctl stop <サービス名>指定したサービスを停止します
サービス再起動systemctl restart <サービス名>指定したサービスを停止してから再起動します
サービス再読み込みsystemctl reload <サービス名>設定ファイルを再読み込みしてサービスを再起動せずに反映します(サービスがreloadをサポートしている場合)
サービス状態確認systemctl status <サービス名>指定したサービスの状態を詳細に表示します
サービス一覧表示systemctl list-units --type=service全てのサービスユニットの状態を一覧表示します

具体的な使用例を示します。例えば、Nginxサービスを管理する場合:

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

Nginxサービスの状態を確認

sudo systemctl status nginx

Nginxサービスを再起動

sudo systemctl restart nginx

Nginxサービスを停止

sudo systemctl stop nginx

サービスの状態確認コマンド(systemctl status)は非常に詳細な情報を提供します。例えば、以下のような出力が得られます:

● 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 2026-06-02 10:30:45 JST; 5min ago
       Docs: man:nginx(8)
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 1137)
     Memory: 3.2M
     CGroup: /system.slice/nginx.service
             ├─1234 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─1236 nginx: worker process

この出力から、サービスが正常に起動していること、メモリ使用量、プロセスID、cgroup情報などを確認できます。

サービスの状態確認とログ監視

systemdでは、サービスの状態監視とログ監視が統合されています。以下に、主要な監視コマンドを紹介します:

コマンド説明
systemctl is-active <サービス名>サービスがアクティブかどうかを確認(active/inactive/failed)
systemctl is-enabled <サービス名>サービスが自動起動設定されているかどうかを確認
systemctl is-failed <サービス名>サービスが失敗状態かどうかを確認
journalctl -u <サービス名>指定したサービスのログを表示
journalctl -u <サービス名> -f指定したサービスのログをリアルタイムで表示
journalctl -b現在のブートセッションの全てのログを表示
journalctl --since "2026-06-01 00:00:00"特定の時間範囲のログを表示

例えば、Apacheサービス(httpd)の状態を包括的に確認するには:

# Apacheサービスがアクティブかどうか確認
systemctl is-active httpd

Apacheサービスが自動起動設定されているか確認

systemctl is-enabled httpd

Apacheサービスのログを表示

journalctl -u httpd

Apacheサービスのログをリアルタイムで監視

journalctl -u httpd -f

ログ監視において特に重要なのが、journalctlコマンドです。従来のsyslogと比較して、以下のような利点があります:

  • 統合ログ管理:カーネル、システムサービス、ユーザーアプリケーションのログを一元管理
  • 構造化ログ:JSON形式でのログ出力が可能で、機械的な解析が容易
  • メタデータ付加:各ログにタイムスタンプ、プロセスID、優先度、ユニット名などのメタデータが付加される
  • フィルタリング機能:サービス名、優先度、時間範囲などによる柔軟なフィルタリングが可能

例えば、過去24時間のエラーレベルのログを表示するには:

journalctl -p err --since "24 hours ago"

このコマンドは、システム全体のエラーを迅速に特定するのに非常に有効です。

サービスの自動起動設定(e…

systemdでは、サービスの自動起動設定をenableおよびdisableコマンドで管理します。これは、システム起動時にサービスを自動的に起動するかどうかを制御します。

コマンド説明
systemctl enable <サービス名>サービスを自動起動設定に追加(システム起動時に自動起動)
systemctl disable <サービス名>サービスを自動起動設定から削除(システム起動時に自動起動しない)
systemctl is-enabled <サービス名>サービスが自動起動設定されているかどうかを確認
systemctl list-unit-files --type=service全てのサービスの自動起動設定状況を一覧表示

具体的な使用例を示します。例えば、MariaDBデータベースサービスを自動起動設定するには:

# MariaDBサービスを自動起動設定に追加
sudo systemctl enable mariadb

自動起動設定が正しく行われたか確認

systemctl is-enabled mariadb

出力: enabled

全てのサービスの自動起動設定状況を確認

systemctl list-unit-files --type=service | grep enabled

enableコマンドを実行すると、systemdはサービスのユニットファイルへのシンボリックリンクを作成し、システム起動時に自動的にサービスを起動するように設定します。具体的には、以下のディレクトリにシンボリックリンクが作成されます:

  • /etc/systemd/system/(システム全体の設定)
  • /usr/lib/systemd/system/(パッケージによって提供されるデフォルト設定)
  • /lib/systemd/system/(一部のディストリビューションで使用)

自動起動設定の仕組みを理解する上で重要なのが、依存関係の解決です。systemdは、サービスを有効化する際に、そのサービスが依存する他のサービスも自動的に有効化します。例えば、WebサーバのNginxを有効化すると、Nginxが依存するネットワークサービス(network.target)も自動的に有効化されます。

逆に、サービスを無効化しても、そのサービスが他のサービスから依存されている場合は、依存関係が解消されるまで実際の停止は行われません。このため、disableコマンド実行後もサービスが実行中の場合は、依存関係を確認する必要があります。

実践的なsystemd設定…

サービスユニットファイルの…

systemdのサービス管理の核心は、サービスユニットファイル(.serviceファイル)です。このファイルは、サービスの起動方法、依存関係、リソース制限などを定義します。以下に、サービスユニットファイルの基本的な構造を解説します。

サービスユニットファイルは、以下の3つの場所に配置される可能性があります:

  1. /etc/systemd/system/:システム管理者がカスタマイズするための設定ファイル(最優先)
  2. /usr/lib/systemd/system/:パッケージによって提供されるデフォルト設定
  3. /lib/systemd/system/:一部のディストリビューションで使用されるシステムデフォルト設定

カスタマイズする際は、常に/etc/systemd/system/ディレクトリにファイルを配置します。これにより、パッケージのアップデートによって設定が上書きされることを防げます。

以下に、基本的なサービスユニットファイルの例を示します(Nginxサービスの例):

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

[Service]
Type=simple
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

このファイルは、3つのセクション([Unit][Service][Install])で構成されています。それぞれのセクションの主なディレクティブを解説します:

[Unit]セクション

  • Description:サービスの説明文
  • After:このサービスの起動が依存する他のユニット(サービスが起動する前に起動が完了している必要があるユニット)
  • Before:このサービスの起動よりも前に起動されるべきユニット
  • Requires:このサービスが正常に機能するために必須の他のユニット
  • Wants:このサービスが利用するが必須ではない他のユニット
  • Conflicts:このサービスと競合する他のユニット

[Service]セクション

  • Type:サービスの起動タイプ(後述)
  • ExecStart:サービスのメインプロセスを起動するコマンド
  • ExecStartPre:サービス起動前に実行するコマンド
  • ExecStartPost:サービス起動後に実行するコマンド
  • ExecReload:設定ファイルを再読み込みする際に実行するコマンド
  • ExecStop:サービスを停止する際に実行するコマンド
  • ExecStopPost:サービス停止後に実行するコマンド
  • Restart:サービスが異常終了した際の再起動ポリシー
  • RestartSec:再起動までの待機時間(秒)
  • User:サービスを実行するユーザー
  • Group:サービスを実行するグループ
  • WorkingDirectory:サービスの作業ディレクトリ
  • Environment:環境変数の設定
  • EnvironmentFile:環境変数を記載したファイルのパス
  • LimitNOFILE:プロセスが開けるファイルディスクリプタの最大数
  • PrivateTmp:独立した/tmpディレクトリを割り当てるかどうか

[Install]セクション

  • WantedBy:このサービスを有効化した際に起動されるターゲットユニット
  • Alias:サービスの別名
  • RequiredBy:このサービスに依存する他のユニット

Typeディレクティブは、サービスの起動タイプを指定します。主なタイプは以下の通りです:

タイプ説明使用例
simpleExecStartで指定されたプロセスがメインプロセス(デフォルト)Nginx、Apacheなど
forkingExecStartで指定されたプロセスが親プロセスとなり、子プロセスがメインプロセスデータベースサーバー(MySQL、PostgreSQL)
oneshotExecStartで指定されたコマンドが一度実行されて終了する初期化スクリプト、セットアップジョブ
dbusD-Busサービスとして登録されるD-Busを介したサービス
notifyExecStartで起動されたプロセスがsystemdに起動完了を通知する起動完了まで待機が必要なサービス
idle他のジョブが完了した後に実行されるシステム負荷が低い時間帯に実行するジョブ

依存関係の管理:Befor…

systemdにおける依存関係管理は、サービスの起動順序や起動条件を正確に制御するために不可欠です。依存関係には大きく分けて2種類あります:

  1. 順序依存:サービスAがサービスBよりも先に起動する/後に起動する
  2. 機能依存:サービスAが正常に機能するためにサービスBが必要

これらの依存関係は、主に[Unit]セクションのディレクティブで定義されます。以下に、主要な依存関係ディレクティブを解説します:

【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
ABOUT ME
たから
サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営
ディレクティブ種類説明使用例
After順序依存このユニットの起動は、指定されたユニットの起動後に行われるAfter=network.target
Before順序依存このユニットの起動は、指定されたユニットの起動前に行われるBefore=multi-user.target
Requires機能依存このユニットが正常に機能するために、指定されたユニットが必要(必須)Requires=postgresql.service
Wants機能依存このユニットが正常に機能するために、指定されたユニットが望ましい(任意)Wants=network-online.target
BindsTo機能依存Requiresと似ているが、指定されたユニットが停止するとこのユニットも停止するBindsTo=dbus.service
PartOf機能依存このユニットが属するグループを指定(グループ内のユニットが停止するとこのユニットも停止する)PartOf=postgresql.service