systemdサービス管理完全ガイド【2026年版】

Linuxシステムの安定稼働を支えるsystemdサービス管理のベストプラクティスを、2026年の最新動向を踏まえて完全解説します。サービスの自動起動設定、依存関係管理、トラブルシューティングまで、実務で即活用できる具体的な手法を網羅。システム管理者必携のリファレンスガイドです。
—
目次
- systemdサービス管理の基礎知識
- サービスユニットファイルの作成と編集
- サービスの起動・停止・再起動
- 依存関係とターゲットの管理
- トラブルシューティングとログ解析
- 上級者向け:カスタムサービスとセキュリティ
- よくある質問と回答
- まとめと次に学ぶべきこと
—
systemdサービス管理の基礎知識
Linuxシステムの安定稼働を支えるsystemdは、2026年現在、主要なLinuxディストリビューション(Ubuntu 24.04 LTS、RHEL 10、Debian 13、AlmaLinux 10など)で標準採用されています。従来のSysVinitと比較して、並列起動による高速化、依存関係の自動解決、リソース管理機能など、多くのメリットを提供します。
systemdのコア機能は以下の通りです:
- サービス管理:サービスの起動・停止・再起動を一元管理
- デバイス管理:udevと連携したデバイスの自動検出と制御
- ログ管理:journaldによる統合ログシステム
- 依存関係解決:サービス間の依存関係を自動で管理
- リソース制御:cgroupsを活用したリソース制限
systemdが採用される主な理由は、システム起動の高速化です。従来のSysVinitではサービスが直列起動されていたのに対し、systemdでは並列起動が可能となり、特にサーバ環境で顕著なパフォーマンス向上が見られます。例えば、RHEL 9における起動時間は、SysVinit時代と比較して約40%短縮されています(出典: Red Hat社内ベンチマーク)。
また、systemdはサービスの状態監視機能も強化しています。サービスがクラッシュした際には自動的に再起動を試みる機能(Restart=on-failure)や、リソース使用量の監視(MemoryLimit、CPUQuota)など、運用面での負担を大幅に軽減します。
—
サービスユニットファイルの作成と編集
サービスユニットファイルの基本構造とディレクティブ
systemdサービスを管理するには、/etc/systemd/system/ディレクトリ配下にサービスユニットファイル(拡張子.service)を作成します。基本的な構造は以下の通りです:
| セクション | 主なディレクティブ | 説明 |
|---|---|---|
| [Unit] | Description, After, Requires, Wants | サービスの説明や依存関係を定義 |
| [Service] | Type, ExecStart, ExecStop, Restart, User, Group | サービスの実行方法や動作モードを指定 |
| [Install] | WantedBy | サービスの自動起動設定 |
以下は、Nginxサービスのユニットファイルの例です:
<?xml version="1.0" encoding="UTF-8"?>
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true
User=nginx
Group=nginx
[Install]
WantedBy=multi-user.target
この例では、以下のポイントが重要です:
- Type=forking:Nginxがバックグラウンドで動作することを明示
- PrivateTmp=true:セキュリティ向上のため、独立した/tmpディレクトリを使用
- User=nginx:root権限ではなく専用ユーザーで実行
- After=network.target:ネットワークが利用可能になった後に起動
サービスの動作モード設定
systemdのサービスには、以下の主な動作モードがあります:
| Type値 | 動作モード | 説明 | 使用例 |
|---|---|---|---|
| simple | 単純なプロセス | サービスがフォアグラウンドで動作し、直後に終了 | Webサーバー(Nginx、Apache) |
| forking | デーモンプロセス | 親プロセスが子プロセスをforkし、親が直後に終了 | データベースサーバー(MySQL、PostgreSQL) |
| oneshot | 一時的なタスク | 一度実行されると終了するタスク | 初期設定スクリプト |
| dbus | D-Busサービス | D-Busインターフェース経由で制御可能なサービス | デスクトップ環境のサービス |
| notify | 通知付きプロセス | サービスが完全に起動したことを通知する | 高可用性サービス |
例えば、Pythonで作成したWebアプリケーションをsystemdで管理する場合、以下のように設定します:
[Unit]
Description=My Python Web Application
After=network.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
環境変数とリソース制限の設定
systemdでは、サービスごとに環境変数やリソース制限を設定できます。例えば、メモリ使用量を制限する場合:
[Service]
MemoryLimit=512M
MemorySwapMax=1G
CPU使用率を制限する場合:
[Service]
CPUQuota=50%
これらの設定は、システム全体の安定性を保つために重要です。特にコンテナ環境や仮想マシンでは、リソース制限を適切に設定しないと、他のサービスに影響を与える可能性があります。
—
サービスの起動・停止・再起動
基本的なサービス操作コマンド
systemdサービスの管理には、systemctlコマンドを使用します。主なコマンドは以下の通りです:
| コマンド | 説明 | 使用例 |
|---|---|---|
| systemctl start | サービスを起動 | systemctl start nginx |
| systemctl stop | サービスを停止 | systemctl stop nginx |
| systemctl restart | サービスを再起動 | systemctl restart nginx |
| systemctl reload | 設定ファイルを再読み込み(サービスを停止せず) | systemctl reload nginx |
| systemctl status | サービスの状態を表示 | systemctl status nginx |
| systemctl enable | サービスを自動起動に設定 | systemctl enable nginx |
| systemctl disable | サービスの自動起動を解除 | systemctl disable nginx |
例えば、Nginxサービスを起動し、自動起動を有効にするには以下のように実行します:
# サービスを起動
sudo systemctl start nginx
サービスの状態を確認
sudo systemctl status nginx
自動起動を有効化
sudo systemctl enable nginx
サービスの状態監視とトラブルシューティング
サービスの状態を詳細に確認するには、systemctl statusコマンドを使用します。例えば、以下の出力はNginxサービスが正常に動作している状態を示しています:
● nginx.service - The NGINX HTTP and reverse proxy server
Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-05-20 10:00:00 JST; 1h ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 2 (limit: 1137)
Memory: 4.2M
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx
└─1235 nginx: worker process
この出力から、以下の情報が得られます:
- サービスが有効(自動起動設定済み)
- 現在実行中(active (running))
- メモリ使用量が4.2MB
- PID 1234で動作中
サービスが起動に失敗した場合は、journalctlコマンドでログを確認します:
# サービス固有のログを表示
sudo journalctl -u nginx.service
直近のシステムログを表示
sudo journalctl -b
サービスの再起動戦略
サービスの再起動には、以下の3つの主な方法があります:
- systemctl restart:サービスを完全に停止してから再起動
- systemctl reload:設定ファイルのみを再読み込み(サービスを停止しない)
- systemctl try-restart:サービスが実行中の場合のみ再起動
例えば、Nginxの設定ファイルを変更した後は、reloadを使用して設定を反映させます:
sudo systemctl reload nginx
一方、サービス自体に重大な変更を加えた場合は、restartを使用します:
sudo systemctl restart nginx
サービスの再起動に関するベストプラクティス:
- 設定ファイルの変更のみの場合は
reloadを使用 - サービスのバイナリや実行ファイルを変更した場合は
restartを使用 - サービスがクラッシュした場合は
try-restartを使用
—
依存関係とターゲットの管理
依存関係の定義方法
systemdでは、サービス間の依存関係を明示的に定義できます。主な依存関係ディレクティブは以下の通りです:
| ディレクティブ | 説明 | 使用例 |
|---|---|---|
| Requires | 必須の依存関係(失敗するとサービスも失敗) | Requires=postgresql.service |
| Wants | 任意の依存関係(失敗してもサービスは起動) | Wants=network-online.target |
| After | 起動順序の指定 | After=mysql.service |
| Before | 起動順序の指定(逆順) | Before=apache2.service |
| Conflicts | 競合するサービス(同時に起動できない) | Conflicts=postgresql.service |
例えば、Webアプリケーションがデータベースに依存する場合、以下のように設定します:
[Unit]
Description=My Web Application
After=postgresql.service
Requires=postgresql.service
[Service]
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=always
[Install]
WantedBy=multi-user.target
この設定では、以下の動作が保証されます:
- PostgreSQLサービスが起動した後にWebアプリケーションが起動
- PostgreSQLサービスが失敗するとWebアプリケーションも失敗
ターゲット(ランレベル)の切り替え方法
systemdでは、従来のSysVinitにおけるランレベル(runlevel)に相当する「ターゲット」が導入されています。主なターゲットは以下の通りです:
| ターゲット名 | 説明 | 対応するSysVinitランレベル |
|---|---|---|
| multi-user.target | マルチユーザーモード(テキストログイン) | runlevel 3 |
| graphical.target | グラフィカルモード(GUIログイン) | runlevel 5 |
| rescue.target | レスキューモード(シングルユーザー) | runlevel 1 |
| emergency.target | 緊急モード(rootシェル) | 該当なし |
| poweroff.target | システムシャットダウン | runlevel 0 |
| reboot.target | システム再起動 | runlevel 6 |
ターゲットの切り替えには、systemctl isolateコマンドを使用します:
# グラフィカルモードに切り替え
sudo systemctl isolate graphical.target
マルチユーザーモードに切り替え
sudo systemctl isolate multi-user.target
また、サービスを特定のターゲットに関連付けるには、WantedByディレクティブを使用します:
[Install]
WantedBy=multi-user.target
これにより、システム起動時に自動的にサービスが起動されます。
依存関係のトラブルシューティング手順
依存関係に関するトラブルが発生した場合は、以下の手順で解決します:
- 依存関係の確認:
systemctl list-dependenciesコマンドで依存関係を表示 - サービスの状態確認:
systemctl statusで個々のサービスの状態を確認 - ログの確認:
journalctlでエラーメッセージを確認 - 依存関係の再設定:必要に応じてユニットファイルを修正
例えば、PostgreSQLサービスに依存するWebアプリケーションが起動しない場合:
# 依存関係を確認
systemctl list-dependencies myapp.service
PostgreSQLサービスの状態を確認
systemctl status postgresql.service
ログを確認
journalctl -u postgresql.service -b
依存関係のトラブルシューティングで特に注意すべきポイント:
- 循環依存(A→B→A)が発生していないか確認
- 必須依存(Requires)と任意依存(Wants)を適切に使い分ける
- ネットワークサービス(network.target)への依存を忘れない
—
トラブルシューティングとログ解析
systemdのログ管理システムjournald
systemdは、従来のsyslogに代わる統合ログシステムとしてjournaldを提供しています。journaldの主な特徴は以下の通りです:
- バイナリ形式のログ保存(効率的なストレージ使用)
- リアルタイムのログストリーミング
- サービス固有のログフィルタリング
- メタデータ(PID、UID、GIDなど)の保存
主なjournalctlコマンドの使用例:
| コマンド | 説明 | 使用例 |
|---|---|---|
| journalctl | 全てのログを表示 | journalctl |
| journalctl -u | 特定のサービスのログを表示 | journalctl -u nginx.service |
| journalctl -f | リアルタイムでログを表示 | journalctl -f |
| journalctl –since | 特定の時間以降のログを表示 | journalctl –since “2024-05-20 10:00:00” |
| journalctl -p | 特定の優先度以上のログを表示 | journalctl -p err |
| journalctl –no-pager | ページャなしでログを表示 | journalctl –no-pager | grep error |
例えば、Nginxサービスのエラーログを確認するには:
journalctl -u nginx.service -p err
直近1時間のシステムログを確認するには:
journalctl --since "1 hour ago"
一般的なトラブルパターンと解決策
systemdサービス管理における一般的なトラブルとその解決策を以下にまとめます:
| トラブルパターン | 原因 | 解決策 |
|---|---|---|
| サービスが起動しない | ユニットファイルの構文エラー | journalctl -u |
| サービスが直後に停止する | Type=simpleでforkingプロセスを起動 | Type=forkingに変更し、ExecStartで正しいプロセスを指定 |
| 依存関係のサービスが見つからない | サービス名のスペルミスやパッケージ未インストール | 正しいサービス名を確認し、必要なパッケージをインストール |
| リソース不足でサービスが停止 | メモリやCPUの制限が厳しすぎる | MemoryLimitやCPUQuotaを調整 |
| ネットワークサービス起動前のサービス起動 | After=network.targetが設定されていない | After=network.targetを[Unit]セクションに追加 |
| サービスの再起動が繰り返される | Restart=alwaysとExitCode=0の組み合わせ | Restart=on-failureに変更し、適切なExitCodeを設定 |
パフォーマンス監視と最適化
systemdサービスのパフォーマンスを監視するには、以下のツールを活用します:
- systemd-analyze:システム起動時間の分析
- systemctl status:サービスのリソース使用量を確認
- cgtop:cgroupsのリソース使用量をリアルタイム監視
- sar(sysstatパッケージ):システム全体のリソース使用量を監視
例えば、システム起動時間を分析するには:
# 起動時間の概要を表示
systemd-analyze
各サービスの起動時間を詳細表示
systemd-analyze blame
起動プロセスのグラフィカル表示
systemd-analyze plot > boot.svg
サービスのリソース使用量を監視するには:
# サービスの状態を確認(メモリ・CPU使用量表示)
systemctl status nginx.service
cgroupsのリソース使用量を監視
sudo cgtop
パフォーマンス最適化のポイント:
- 不要なサービスを無効化し、起動時間を短縮
- リソース制限(MemoryLimit、CPUQuota)を適切に設定
- サービスの並列起動を活用し、起動時間を短縮
- ログ出力を最小限に抑え、ディスクI/Oを削減
—
上級者向け:カスタムサービスとセキュリティ
カスタムサービスの作成と管理
systemdを活用して、独自のサービスを作成する方法を解説します。例えば、Pythonスクリプトを常時実行するサービスを作成する場合:
- サービスユニットファイルの作成:
/etc/systemd/system/myscript.service - 実行スクリプトの作成:
/opt/myscript/myscript.py - 権限設定:専用ユーザーとグループの作成
- サービスの有効化と起動
具体的な手順:
# 専用ユーザーとグループの作成
sudo useradd -r -s /bin/false myscriptuser
sudo mkdir -p /opt/myscript
sudo chown myscriptuser:myscriptuser /opt/myscript
サービスユニットファイルの作成
sudo vi /etc/systemd/system/myscript.service
サービスユニットファイルの内容:
[Unit]
Description=My Custom Python Script
After=network.target
[Service]
Type=simple
User=myscriptuser
Group=myscriptuser
WorkingDirectory=/opt/myscript
ExecStart=/usr/bin/python3 /opt/myscript/myscript.py
Restart=always
RestartSec=10s
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
サービスの有効化と起動:
# systemdに新しいサービスを認識させる
sudo systemctl daemon-reload
サービスを有効化
sudo systemctl enable myscript.service
サービスを起動
sudo systemctl start myscript.service
セキュリティ強化のための設定
systemdサービスのセキュリティを強化するための主な設定項目:
| 設定項目 | 説明 | 設定例 |
|---|---|---|
| User/Group | root権限ではなく専用ユーザーで実行 | User=appuser Group=appuser |
| PrivateTmp | 独立した/tmpディレクトリを使用 | PrivateTmp=true |
| ProtectSystem | システムディレクトリへの書き込みを禁止します | ProtectSystem=strict |
| ProtectHome | ホームディレクトリへのアクセスを禁止します | ProtectHome=yes |
| NoNewPrivileges | 新しい特権を取得できないようにします | NoNewPrivileges=yes |
| RestrictAddressFamilies | 使用可能なアドレスファミリーを制限 | RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 |
| CapabilityBoundingSet | 使用可能なLinux Capabilityを制限 | CapabilityBoundingSet=CAP_NET_BIND_SERVICE |
例えば、Webサーバーのセキュリティを強化する場合:
[Service]
User=www-data
Group=www-data
PrivateTmp=true
ProtectSystem=full
ProtectHome=yes
NoNewPrivileges=yes
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
これにより、以下のセキュリティ強化が実現されます:
- root権限ではなく専用ユーザーで実行
- /tmpディレクトリが他のサービスと分離
- システムディレクトリへの書き込みが禁止
- ホームディレクトリへのアクセスが禁止
- 新しい特権の取得が禁止
- 使用可能なネットワークアドレスファミリーが制限
- 使用可能なLinux Capabilityが最小限に制限
コンテナ環境でのsystemd活用
近年、コンテナ技術(Docker、Podman、LXCなど)とsystemdを組み合わせた運用が増加しています。systemdをコンテナ内で使用する主なメリット:
- サービスの自動再起動機能
- リソース制限の設定
- ログ管理の一元化
- 依存関係の管理
Podman(Docker互換のコンテナエンジン)を使用してsystemd




