プロセス管理

Linux systemdサービス管理入門|サーバーのプロセスを管理する

Linux systemd サービス管理

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ソケットによるサービス起動
タイマー.timercronの代替となる定期実行
マウント.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-restartreload優先で試行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"

確認すべきポイント:

項目確認内容
Activeactive (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)をサービスとして登録します。

/etc/systemd/system/myapp.service
[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起動コマンド
ExecReloadreload時のコマンド
Restart異常終了時の再起動ポリシー
RestartSec再起動までの待機秒数

[Install] セクション — enable時の挙動

ディレクティブ説明
WantedByenableで紐づけるターゲット(通常は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
優先度意味
emerg0システムが使用不能
alert1即座に対処が必要
crit2致命的な状態
err3エラー
warning4警告
notice5通常だが重要な状態
info6情報
debug7デバッグ情報

ログのディスク使用量管理

ターミナル
# ジャーナルのディスク使用量を確認
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 でリアルタイムログ監視ができる
  • トラブル時は statusjournalctl の順で原因を特定する