Linuxサーバー管理

systemdとサービス管理【ユニットファイルの仕組みと自作サービス登録】

Linuxサーバー管理
記事内に広告が含まれています。

Phase 1ではsystemctlの基本操作を学びました。この記事ではsystemdの内部構造・ユニットファイルの書き方・依存関係管理まで深掘りします。自作サービスを登録して自動起動させるところまで解説します。

systemdとは?initとの違い

systemdはLinuxの初期化システム(PID 1)です。従来のinitと比較して、サービスの並列起動・依存関係管理・ログの一元管理(journald)などが大幅に強化されています。Ubuntu 15.04以降、RHEL 7以降で標準採用されています。

ユニットの種類

ユニット種類拡張子用途
Service.serviceデーモン・サービスの管理
Timer.timer定期実行(cronの代替)
Socket.socketソケットベースのアクティベーション
Target.targetユニットのグループ化(runlevel相当)
Mount.mountファイルシステムのマウント
Path.pathファイル変更の監視

systemctl コマンド詳細

# サービスの状態確認(詳細)
$ systemctl status nginx

# 全サービスの状態一覧
$ systemctl list-units --type=service

# 起動失敗したサービスを確認
$ systemctl list-units --state=failed

# 依存関係を確認
$ systemctl list-dependencies nginx

# サービスのユニットファイルを確認
$ systemctl cat nginx

# ユニットファイルの変更後にリロード
$ sudo systemctl daemon-reload

# デフォルトのターゲット(起動レベル)を確認
$ systemctl get-default

# ターゲットを変更(例:GUIなしのmulti-user)
$ sudo systemctl set-default multi-user.target

自作サービスのユニットファイルを書く

自分のスクリプトやアプリをsystemdサービスとして登録する方法です。

# ユニットファイルの配置場所
/etc/systemd/system/    # システム管理者が作成(推奨)
/usr/lib/systemd/system/ # パッケージがインストールするもの

# 例:/etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target        # ネットワークスタック起動後に起動
# ⚠️ network.target は「ネットワークが実際に使える状態」を保証しません
# 接続完了まで待ちたい場合(API呼び出しなど)は以下を使う
# Wants=network-online.target
# After=network-online.target

[Service]
Type=simple
User=myuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/start.sh
ExecStop=/opt/myapp/stop.sh
Restart=on-failure          # 失敗時に自動再起動
RestartSec=5                # 再起動まで5秒待つ
StandardOutput=journal      # ログをjournaldに送る
StandardError=journal

[Install]
WantedBy=multi-user.target  # multi-user起動時に有効化
# 登録・有効化・起動
$ sudo systemctl daemon-reload
$ sudo systemctl enable myapp
$ sudo systemctl start myapp
$ sudo systemctl status myapp

# ログを確認
$ journalctl -u myapp -f

Serviceセクションの主要オプション

オプション説明
Type=simpleExecStartが起動したプロセスがメインプロセス(デフォルト)
Type=forkingプロセスがforkしてデーモン化する場合
Type=oneshot1回だけ実行して終了するスクリプト向け
Restart=always常に再起動(終了コードに関わらず)
Restart=on-failure失敗時のみ再起動
TimeoutStartSec=30起動タイムアウト(秒)
LimitNOFILE=65536開けるファイル数の上限

まとめ

  • systemdはPID 1として全サービスを管理。並列起動・依存関係・ログ一元管理が特徴
  • systemctl list-units --state=failedで障害を即座に特定
  • ユニットファイルは/etc/systemd/system/に配置しdaemon-reload後に有効化
  • After=network.targetはネットワークスタックの後に起動するが接続完了は保証しない。実際のネットワーク接続が必要なら Wants=network-online.target + After=network-online.target を使う
  • Restart=on-failureで自動復旧

📋 Linuxサーバー運用・管理チェックリスト完全版でPhase 2の全要点を確認できます。

コメント

タイトルとURLをコピーしました