Linux systemdサービス管理入門
サーバーのプロセスを管理する
systemdを使ったサービスの起動・停止・自動起動の設定から、独自サービスの作成方法、ログの確認方法まで解説します。
こんな人向けの記事です
- Linuxサーバーでサービスを管理したい
- 自作アプリをサービスとして自動起動したい
- systemctlやjournalctlの使い方を知りたい
Step 1systemdとは
systemdは、Linuxシステムの起動プロセスやサービス(デーモン)を管理する仕組みです。現在のほとんどのLinuxディストリビューション(Ubuntu, CentOS/RHEL, Debian, Fedora等)で標準のinitシステムとして採用されています。
systemdの主な役割
- システム起動時のプロセス管理(PID 1として動作)
- サービス(httpd, nginx, sshd等)のライフサイクル管理
- サービス間の依存関係の解決
- ログ(ジャーナル)の一元管理
systemdでは、管理対象をユニット(Unit)という単位で扱います。ユニットにはいくつかの種類があります。
| ユニットの種類 | 拡張子 | 説明 |
|---|---|---|
| サービス | .service | デーモンプロセスの管理 |
| ソケット | .socket | ソケットによるサービス起動 |
| タイマー | .timer | cronの代替となる定期実行 |
| マウント | .mount | ファイルシステムのマウント |
| ターゲット | .target | ユニットのグループ化 |
この記事では最も頻繁に使う.service(サービスユニット)を中心に解説します。
Step 2サービスの起動・停止・再起動
サービスの操作はsystemctlコマンドで行います。これがsystemdのメインのコントロールツールです。
サービスの起動
# nginxを起動
sudo systemctl start nginx
# PostgreSQLを起動
sudo systemctl start postgresql
サービスの停止
# nginxを停止
sudo systemctl stop nginx
# PostgreSQLを停止
sudo systemctl stop postgresql
サービスの再起動
# 再起動(停止→起動)
sudo systemctl restart nginx
# 設定のリロード(プロセスは維持したまま設定を再読み込み)
sudo systemctl reload nginx
# reload可能ならreload、不可なら restart
sudo systemctl reload-or-restart nginx
| コマンド | 動作 | 用途 |
|---|---|---|
start | サービスを起動 | 停止中のサービスを開始する |
stop | サービスを停止 | 実行中のサービスを終了する |
restart | 停止→起動 | 設定変更後の完全再起動 |
reload | 設定の再読み込み | プロセスを止めずに設定反映 |
reload-or-restart | reload優先で試行 | reloadの可否が不明な場合 |
注意: restartはサービスを一時的に停止するため、本番環境ではダウンタイムが発生します。設定変更だけの場合は、まずreloadが可能か確認しましょう。
Step 3サービスの自動起動設定
サーバーの再起動後に自動でサービスが立ち上がるようにするには、enableを使います。
自動起動を有効にする
# nginx をOS起動時に自動起動するよう設定
sudo systemctl enable nginx
# 今すぐ起動 + 自動起動も有効にする(--now オプション)
sudo systemctl enable --now nginx
自動起動を無効にする
# 自動起動を無効にする
sudo systemctl disable nginx
# 今すぐ停止 + 自動起動も無効にする
sudo systemctl disable --now nginx
自動起動の確認
# 特定サービスの自動起動状態を確認
systemctl is-enabled nginx
# 出力例: enabled
# 全サービスの自動起動状態を一覧表示
systemctl list-unit-files --type=service
| 状態 | 意味 |
|---|---|
enabled | 自動起動が有効 |
disabled | 自動起動が無効 |
static | 他のサービスからの依存でのみ起動 |
masked | 完全に無効化(起動不可) |
enableの仕組み: systemctl enableは、/etc/systemd/system/配下にシンボリックリンクを作成することで自動起動を実現しています。disableするとこのリンクが削除されます。
Step 4サービスの状態確認
サービスが正常に動作しているかを確認するにはstatusを使います。
systemctl status nginx
出力例:
● nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-02-18 10:00:00 JST; 2h ago
Docs: man:nginx(8)
Process: 1234 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
Main PID: 1235 (nginx)
Tasks: 3 (limit: 4915)
Memory: 8.5M
CPU: 120ms
CGroup: /system.slice/nginx.service
├─1235 "nginx: master process /usr/sbin/nginx"
├─1236 "nginx: worker process"
└─1237 "nginx: worker process"
確認すべきポイント:
| 項目 | 確認内容 |
|---|---|
Active | active (running) なら正常動作中 |
Loaded | ユニットファイルのパスと自動起動状態 |
Main PID | メインプロセスのPID |
Tasks | サービスが使用しているタスク数 |
Memory | メモリ使用量 |
| ログ | 最新のログ行(エラー原因の特定に有用) |
その他の確認コマンド
# 動作中か確認(スクリプトで使いやすい)
systemctl is-active nginx
# 出力例: active
# 失敗したサービスの一覧
systemctl --failed
# 全サービスの一覧
systemctl list-units --type=service
# 動作中のサービスのみ表示
systemctl list-units --type=service --state=running
トラブル時の基本手順: サービスが起動しない場合は、(1) systemctl status サービス名でエラー概要を確認 → (2) journalctl -u サービス名で詳細ログを確認、の順で調査します。
Step 5ユニットファイルの作成方法
自作のアプリケーションをsystemdサービスとして動かすには、ユニットファイルを作成します。
ユニットファイルの配置場所
| パス | 用途 |
|---|---|
/etc/systemd/system/ | 管理者が作成するカスタムユニット(推奨) |
/lib/systemd/system/ | パッケージが配置するユニット(編集しない) |
/run/systemd/system/ | ランタイム生成のユニット(一時的) |
基本的なユニットファイルの構造
例として、PythonのWebアプリ(Gunicorn)をサービスとして登録します。
[Unit]
Description=My Web Application
After=network.target postgresql.service
Wants=postgresql.service
[Service]
Type=notify
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp
Environment="DJANGO_SETTINGS_MODULE=myapp.settings"
ExecStart=/opt/myapp/venv/bin/gunicorn --workers 3 --bind unix:/run/myapp/gunicorn.sock myapp.wsgi:application
ExecReload=/bin/kill -s HUP
Restart=on-failure
RestartSec=5
KillMode=mixed
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
各セクションの解説
[Unit] セクション — サービスの説明と依存関係
| ディレクティブ | 説明 |
|---|---|
Description | サービスの説明文 |
After | 指定ユニットの起動後に起動する |
Wants | 指定ユニットも一緒に起動する(失敗しても影響なし) |
Requires | 指定ユニットも一緒に起動する(失敗すると自分も停止) |
[Service] セクション — サービスの実行方法
| ディレクティブ | 説明 |
|---|---|
Type | 起動タイプ(simple, forking, notify, oneshot等) |
User / Group | 実行ユーザー・グループ |
WorkingDirectory | 作業ディレクトリ |
Environment | 環境変数の設定 |
ExecStart | 起動コマンド |
ExecReload | reload時のコマンド |
Restart | 異常終了時の再起動ポリシー |
RestartSec | 再起動までの待機秒数 |
[Install] セクション — enable時の挙動
| ディレクティブ | 説明 |
|---|---|
WantedBy | enableで紐づけるターゲット(通常はmulti-user.target) |
Typeの選び方:
simple(デフォルト)— ExecStartのプロセスがそのままメインプロセスforking— 起動後にフォークしてバックグラウンドで動作(従来型デーモン向け)notify— 起動完了をsd_notifyで通知(Gunicorn等に対応)oneshot— 実行して終了するスクリプト向け
ユニットファイルの登録と起動
# ユニットファイルを作成した後、systemdに再読み込みさせる
sudo systemctl daemon-reload
# サービスを起動
sudo systemctl start myapp
# 状態を確認
systemctl status myapp
# 自動起動を有効化
sudo systemctl enable myapp
重要: ユニットファイルを新規作成・変更した場合は、必ずsudo systemctl daemon-reloadを実行してください。これを忘れると古い設定のまま動作します。
Restartポリシーの選択
| 値 | 再起動するケース |
|---|---|
no | 再起動しない(デフォルト) |
on-failure | 異常終了時のみ |
on-abnormal | シグナルやタイムアウトによる終了時 |
always | 常に再起動(手動stopを除く) |
Step 6ジャーナルログの確認
systemdはjournaldというログ管理システムを備えており、journalctlコマンドでログを確認できます。
基本的なログ確認
# 特定サービスのログを表示
journalctl -u nginx
# 最新のログを末尾から表示(tail相当)
journalctl -u nginx -n 50
# リアルタイムでログを監視(tail -f 相当)
journalctl -u nginx -f
期間を指定したログ確認
# 今日のログだけ表示
journalctl -u nginx --since today
# 時間指定
journalctl -u nginx --since "2026-02-18 09:00" --until "2026-02-18 12:00"
# 直近1時間のログ
journalctl -u nginx --since "1 hour ago"
# 前回の起動以降のログ
journalctl -u nginx -b
ログの優先度フィルタ
# エラー以上のログのみ表示
journalctl -u nginx -p err
# 警告以上のログを表示
journalctl -u nginx -p warning
| 優先度 | 値 | 意味 |
|---|---|---|
emerg | 0 | システムが使用不能 |
alert | 1 | 即座に対処が必要 |
crit | 2 | 致命的な状態 |
err | 3 | エラー |
warning | 4 | 警告 |
notice | 5 | 通常だが重要な状態 |
info | 6 | 情報 |
debug | 7 | デバッグ情報 |
ログのディスク使用量管理
# ジャーナルのディスク使用量を確認
journalctl --disk-usage
# 古いログを削除(2週間より前)
sudo journalctl --vacuum-time=2weeks
# ディスク使用量の上限を指定して削除
sudo journalctl --vacuum-size=500M
永続化の設定: デフォルトではジャーナルログは再起動時に消える場合があります。永続化するには sudo mkdir -p /var/log/journal を実行し、sudo systemctl restart systemd-journald でジャーナルを再起動してください。
まとめ
systemdサービス管理チェックリスト
systemctl start/stop/restartでサービスを操作するsystemctl enable --nowで自動起動と即時起動を同時に行うsystemctl statusでActive状態とエラーを確認する- ユニットファイルは
/etc/systemd/system/に配置する - ユニットファイル変更後は
daemon-reloadを忘れずに実行する journalctl -u サービス名 -fでリアルタイムログ監視ができる- トラブル時は
status→journalctlの順で原因を特定する