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

systemdサービス管理【2026年7月更新】
Linuxシステムの安定稼働を支えるsystemdサービス管理で、サービスの起動・停止・再起動・ステータス確認を完全制覇しよう。本記事では、systemdの基本コマンドから実践的なトラブルシューティングまで、現場で即実践できるノウハウを網羅する。
目次
—systemdサービス管理とは
Linuxシステムのサービス管理を一元化するsystemdは、従来のSysVinitに代わる現代的なinitシステムであり、2026年現在ではほぼ全ての主要Linuxディストリビューションで採用されています。systemdはサービスの起動・停止・再起動だけでなく、依存関係の管理、リソース制限、ログ管理まで包括的に担う統合プラットフォームです。
具体的には、以下の機能を提供します:
- 並列起動:従来のinitシステムよりも高速なシステム起動
- 依存関係自動解決:サービス間の依存関係を自動で管理
- リソース制御:cgroupsを活用したCPU・メモリ制限
- ログ管理:ジャーナルログシステム(journald)による統合ログ管理
- デバイス管理:udevとの連携による動的デバイス管理
systemdが導入された背景には、サーバー環境の複雑化に伴い、従来のinitシステムでは対応しきれなくなったという技術的課題がありました。特に、大規模なサービス群を効率的に管理するニーズが高まったことが、systemd普及の原動力となっています。
(出典: systemd公式ドキュメント)
—基本コマンド一覧
systemdサービス管理の基本となるコマンド群を、実用的な順に整理します。これらのコマンドは全てroot権限で実行する必要があります。
| コマンド | 説明 | 使用例 | 備考 |
|---|---|---|---|
| systemctl status | サービスの現在の状態を表示 | systemctl status nginx | サービス名の自動補完が利用可能 |
| systemctl start | サービスを起動 | systemctl start postgresql | 依存関係のあるサービスも自動起動 |
| systemctl stop | サービスを停止 | systemctl stop apache2 | 即時停止でデータ損失の可能性あり |
| systemctl restart | サービスを再起動 | systemctl restart docker | 設定変更後の反映に使用 |
| systemctl reload | 設定ファイルの再読み込みのみ | systemctl reload sshd | サービスを完全停止せずに設定反映 |
| systemctl enable | サービスを自動起動に設定 | systemctl enable mysql | システム起動時に自動で起動 |
| systemctl disable | サービスの自動起動を解除 | systemctl disable cron | 手動起動のみ可能にする |
| systemctl is-active | サービスが稼働中か確認 | systemctl is-active ssh | ステータス確認に特化したコマンド |
| systemctl list-units | 全てのサービスユニットを表示 | systemctl list-units –type=service | フィルタリングが可能 |
これらのコマンドを組み合わせることで、サービスのライフサイクルを完全に制御できます。特に、systemctl enableとsystemctl startを同時に実行するsystemctl enable --nowは、サービスの自動起動設定と即時起動を一括で行えるため、非常に便利です。
サービスファイルの構造と作成
主要ディレクティブ解説
systemdのサービス管理は、.serviceファイルと呼ばれる設定ファイルによって定義されます。これらのファイルは通常/etc/systemd/system/または/usr/lib/systemd/system/に配置されます。
以下に、主要なディレクティブをカテゴリ別に整理します:
サービスの基本情報
| ディレクティブ | 説明 | 例 |
|---|---|---|
| [Unit] | サービスのメタ情報を定義 | Description=My Web Service After=network.target |
| Description | サービスの説明文 | Description=Apache HTTP Server |
| After | 依存関係のあるサービスを指定 | After=network.target |
| Requires | 必須の依存関係を指定 | Requires=postgresql.service |
| Wants | 推奨される依存関係を指定 | Wants=redis.service |
サービスの実行設定
| ディレクティブ | 説明 | 例 |
|---|---|---|
| [Service] | サービスの実行方法を定義 | Type=simple ExecStart=/usr/sbin/nginx |
| Type | サービスの起動タイプを指定 | Type=simple(デフォルト) Type=forking Type=oneshot Type=notify |
| ExecStart | サービスの起動コマンド | ExecStart=/usr/bin/python3 /app/main.py |
| ExecStop | サービスの停止コマンド | ExecStop=/usr/bin/kill -TERM $MAINPID |
| Restart | サービスの再起動ポリシー | Restart=always Restart=on-failure Restart=no |
| User | サービス実行時のユーザー | User=www-data |
| WorkingDirectory | 作業ディレクトリの指定 | WorkingDirectory=/var/www/html |
サービスのリソース制御
| ディレクティブ | 説明 | 例 |
|---|---|---|
| CPUQuota | CPU使用率の上限(%単位) | CPUQuota=50% |
| MemoryLimit | メモリ使用量の上限 | MemoryLimit=1G |
| TasksMax | プロセス数の上限 | TasksMax=1024 |
これらのディレクティブを適切に組み合わせることで、柔軟なサービス管理が可能になります。特に、Typeディレクティブはサービスの起動方法によって適切な値を設定する必要があり、間違った設定はサービスの起動失敗につながります。
実践的なサービスファイル例
以下に、実際のWebアプリケーションを想定したサービスファイルの例を示します。この例では、Python製のWebアプリケーションをsystemdで管理する方法を解説します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE service SYSTEM "service.dtd">
<service>
<!-- 基本情報 -->
<id>my-webapp</id>
<description>My Python Web Application</description>
<after>network.target</after>
<requires>postgresql.service</requires>
<!-- サービス実行設定 -->
<type>simple</type>
<exec>
<start>/usr/bin/python3 /opt/myapp/main.py</start>
<stop>/usr/bin/kill -TERM $MAINPID</stop>
<restart>always</restart>
</exec>
<!-- ユーザーと権限 -->
<user>appuser</user>
<group>appgroup</group>
<working-directory>/opt/myapp</working-directory>
<!-- リソース制御 -->
<cpu-quota>20%</cpu-quota>
<memory-limit>512M</memory-limit>
</service>このサービスファイルのポイント:
Type=simple:アプリケーションがバックグラウンドで動作することを前提としていますRequires=postgresql.service:データベースサービスに依存しますRestart=always:サービスがクラッシュしても自動で再起動しますCPUQuota=20%:CPU使用率を20%に制限しますMemoryLimit=512M:メモリ使用量を512MBに制限します
サービスファイルを作成したら、以下の手順でsystemdに反映します:
- ファイルを
/etc/systemd/system/に配置します sudo systemctl daemon-reloadでsystemdに設定を再読み込みさせますsudo systemctl enable --now my-webappで自動起動を有効化し、即時起動します
サービス管理の実践テクニック
依存関係の管理
systemdにおける依存関係管理は、サービスの安定稼働に不可欠です。依存関係には大きく分けて2種類あります:
強制的依存関係(Requires)
サービスが完全に動作するために必須の依存関係です。依存サービスが失敗すると、主サービスも失敗します。
[Unit] Description=My Application Requires=database.service After=database.service
推奨的依存関係(Wants)
サービスの動作に有用だが必須ではない依存関係です。依存サービスが失敗しても主サービスは起動します。
[Unit] Description=My Application Wants=cache.service After=cache.service
依存関係のトラブルシューティング
依存関係に関する問題が発生した場合は、以下のコマンドで詳細を確認できます:
systemctl list-dependencies <サービス名>:依存関係ツリーを表示journalctl -u <サービス名> -b:サービスの起動ログを確認systemctl show <サービス名>:サービスの詳細な状態を表示
依存関係の設定ミスで最も多いケースは、AfterディレクティブとRequires/Wantsディレクティブの不一致です。例えば、After=network.targetを設定しても、Requires=network.targetを設定しないと、ネットワークが完全に準備できていない状態でサービスが起動する可能性があります。
タイマー機能の活用
systemdのタイマー機能を使用すると、定期的なジョブ実行をsystemdで管理できます。従来のcronに代わる機能として注目されています。
タイマー機能には2つのファイルが必要です:
.timerファイル:実行スケジュールを定義.serviceファイル:実際のジョブを定義
以下に、毎日午前3時に実行されるバックアップジョブの例を示します:
backup.timer(実行スケジュール定義)
[Unit] Description=Daily Backup Timer [Timer] OnCalendar=*-*-* 03:00:00 Persistent=true [Install] WantedBy=timers.target
backup.service(ジョブ定義)
[Unit] Description=Daily Backup Service [Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh
タイマーを有効化するには:
- 両方のファイルを
/etc/systemd/system/に配置 sudo systemctl daemon-reloadでsystemdに認識させるsudo systemctl enable --now backup.timerでタイマーを有効化
タイマー機能の利点:
- cronと異なり、systemdの依存関係管理と統合可能
- サービスのステータス管理が容易
- 時刻指定が柔軟(例:
OnCalendar=Mon..Fri 09:00)
cgroupsとの連携
systemdはLinuxカーネルのcgroups(コントロールグループ)機能を活用して、サービスごとのリソース制御を実現しています。cgroupsを使用すると、CPU、メモリ、I/O、ネットワーク帯域などのリソースをサービスごとに制限できます。
systemdにおけるcgroupsの主な利点:
- サービスごとのリソース使用量の可視化
- リソース制限の自動適用
- サービスの異常時におけるリソースリーク防止
cgroupsを活用したリソース制御の例:
[Unit] Description=Resource Limited Service [Service] Type=simple ExecStart=/usr/bin/myapp CPUQuota=50% MemoryLimit=1G TasksMax=1024 OOMScoreAdjust=-500
この設定では:
CPUQuota=50%:CPU使用率を50%に制限MemoryLimit=1G:メモリ使用量を1GBに制限TasksMax=1024:プロセス数を1024に制限OOMScoreAdjust=-500:OOM Killerによる強制終了を回避
リソース使用量の確認方法:
systemd-cgtop:リアルタイムのリソース使用量を表示systemctl status <サービス名>:サービスのリソース制限状態を表示cat /sys/fs/cgroup/memory/system.slice/<サービス名>/memory.usage_in_bytes:メモリ使用量を確認
トラブルシューティング完全ガイド
systemdサービス管理におけるトラブルシューティングは、ログ分析とシステム状態の確認から始まります。以下に、一般的なトラブルとその解決策を網羅的に解説します。
サービスが起動しない
最も一般的なトラブルの1つです。以下の手順で原因を特定します:
- ステータス確認
systemctl status <サービス名>
このコマンドでサービスの状態、エラーメッセージ、依存関係の状態を確認します。
- ログ確認
journalctl -u <サービス名> -b
サービス固有のログを確認します。
-bオプションでシステム起動以降のログのみ表示します。 - 依存関係確認
systemctl list-dependencies <サービス名>
依存関係のツリー構造を確認し、問題のある依存関係を特定します。
- 手動実行テスト
sudo -u <ユーザー名> <ExecStartコマンド>
サービスファイルの
ExecStartコマンドを手動で実行し、エラーを確認します。
一般的な原因と解決策:
- ファイルパーミッション不足:
chmodやchownで適切な権限を設定 - 依存サービスの未起動:依存サービスを起動または有効化
- 設定ファイルの不正:設定ファイルの構文エラーを修正
- リソース不足:
MemoryLimitやCPUQuotaを調整 - 競合するサービス:
Conflicts=ディレクティブで競合を明示
サービスが頻繁に再起動する
サービスが予期せず再起動を繰り返す場合は、以下の原因が考えられます:
- 設定ミス
Restart=alwaysが設定されているが、サービスが正常に起動していないType=forkingなのに、PIDFile=が正しく設定されていない
- リソース不足
- メモリリークによりOOM Killerがサービスを強制終了
- CPU使用率が
CPUQuotaを超過
- 外部要因
- ネットワーク接続の不安定さ
- 外部サービス(データベース、API)の応答不良
解決策:
Restart=noに変更して手動で再起動を制御RestartSec=で再起動までの待機時間を延長MemoryLimitやCPUQuotaを増加- サービスのログを詳細に分析し、根本原因を特定
サービスがメモリリークを起こす
メモリリークはサービスの安定稼働を脅かす重大な問題です。systemdでは以下の方法でメモリ使用量を監視・制御できます:
- メモリ使用量の監視
systemctl status <サービス名> journalctl -u <サービス名> -b | grep -i memory
サービスの現在のメモリ使用量と履歴を確認します。
- OOM Killerの設定
OOMScoreAdjust=-500
この設定で、OOM Killerによる強制終了を回避します。値は-1000(最も回避)から1000(最も優先的に終了)まで調整できます。
- メモリ制限の設定
MemoryLimit=1G MemorySwapMax=512M
メモリ使用量の上限とスワップ領域の上限を設定します。
- メモリダンプの取得
sudo coredumpctl list sudo coredumpctl info <PID>
サービスがクラッシュした際にメモリダンプを取得し、解析します。
メモリリークの一般的な原因:
- 未解放のメモリ領域(C/C++の場合)
- 循環参照(Python、JavaScriptなど)
- グローバル変数の過剰な使用
- サードパーティライブラリのメモリ管理不備
サービスの起動が遅い
サービスの起動が遅い場合は、以下の要因を検討します:
- 依存関係の待ち時間
After=で指定された依存サービスの起動が完了するまで待機- 解決策:
After=の順序を見直す、またはWants=に変更
- 外部サービスへの依存
- データベースやAPIへの接続待ち
- 解決策:接続タイムアウトの設定、リトライロジックの実装
- ディスクI/Oのボトルネック
- 大量のファイル読み込みや書き込み
- 解決策:
IOSchedulingClass=idleで優先度を下げる
- サービス自体の起動処理
- 不要な初期化処理の実行
- 解決策:起動処理の最適化、遅延読み込みの実装
起動時間の計測方法:
systemd-analyze blame systemd-analyze critical-chain <サービス名>
これらのコマンドで、システム全体および特定サービスの起動にかかる時間を分析できます。
—よくある質問と回答
Q1: systemdとS…
A1: systemdとSysVinitの主な違いは以下の通りです:
- 起動速度:systemdは並列起動によりSysVinitよりも高速(出典: LWN記事)
- 機能統合:systemdはinitシステムだけでなく、udev、cron、syslogなどの機能を統合
- 依存関係管理:systemdは自動的に依存関係を解決し、サービスの起動順序を最適化
- リソース制御:cgroupsを活用したCPU・メモリ制限が可能
- ログ管理:journaldによる統合ログ管理
Q2: systemdサー…
A2: 自動起動を無効にするには以下のコマンドを実行します:
sudo systemctl disable <サービス名>
これにより、システム起動時の自動起動が解除されます。自動起動を再度有効にするには:
sudo systemctl enable <サービス名>
Q3: systemdサー…
A3: サービスファイルを変更した後は、以下の手順で変更を反映します:
- サービスファイルを編集
sudo systemctl daemon-reload:systemdに設定の再読み込みを指示sudo systemctl restart <サービス名>:サービスを再起動して変更を反映
注意:daemon-reloadを実行しないと、変更が反映されません。これはsystemdがサービスファイルのキャッシュを保持しているためです。
Q4: systemdサー…
A4: 環境変数は以下の方法で設定できます:
- サービスファイルに直接記述
[Service] Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Environment="DATABASE_URL=postgres://user:pass@localhost/db"
- 環境変数ファイルを使用
[Service] EnvironmentFile=/etc/myapp/env.conf
このファイルには
VAR_NAME=value形式で環境変数を記述します。 - systemd-drop-inを使用
sudo mkdir -p /etc/systemd/system/<サービス名>/override.conf.d sudo systemctl edit <サービス名>
これにより、既存のサービスファイルを上書きせずに設定を追加できます。
Q5: systemdサー…
A5: User=およびGroup=ディレクティブを使用します:
[Service【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。ABOUT ME




