systemdサービス管理【2026年6月更新】

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つの革新的なアプローチにあります:
| 機能 | SysVinit | Upstart | systemd |
|---|---|---|---|
| 起動速度 | シーケンシャル起動(遅い) | 並列起動(中程度) | 並列起動+オンデマンド起動(高速) |
| 依存関係管理 | 手動設定(スクリプト依存) | イベントベース | 宣言型依存関係(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 |
| デバイスユニット | .device | udevが管理するデバイスの表現 | 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つの場所に配置される可能性があります:
/etc/systemd/system/:システム管理者がカスタマイズするための設定ファイル(最優先)/usr/lib/systemd/system/:パッケージによって提供されるデフォルト設定/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ディレクティブは、サービスの起動タイプを指定します。主なタイプは以下の通りです:
| タイプ | 説明 | 使用例 |
|---|---|---|
| simple | ExecStartで指定されたプロセスがメインプロセス(デフォルト) | Nginx、Apacheなど |
| forking | ExecStartで指定されたプロセスが親プロセスとなり、子プロセスがメインプロセス | データベースサーバー(MySQL、PostgreSQL) |
| oneshot | ExecStartで指定されたコマンドが一度実行されて終了する | 初期化スクリプト、セットアップジョブ |
| dbus | D-Busサービスとして登録される | D-Busを介したサービス |
| notify | ExecStartで起動されたプロセスがsystemdに起動完了を通知する | 起動完了まで待機が必要なサービス |
| idle | 他のジョブが完了した後に実行される | システム負荷が低い時間帯に実行するジョブ |
依存関係の管理:Befor…
systemdにおける依存関係管理は、サービスの起動順序や起動条件を正確に制御するために不可欠です。依存関係には大きく分けて2種類あります:
- 順序依存:サービスAがサービスBよりも先に起動する/後に起動する
- 機能依存:サービスAが正常に機能するためにサービスBが必要
これらの依存関係は、主に[Unit]セクションのディレクティブで定義されます。以下に、主要な依存関係ディレクティブを解説します:
| ディレクティブ | 種類 | 説明 | 使用例 |
|---|---|---|---|
| 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 |




