Mímisbrunnr知恵の泉

← クラウドインフラ 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:シェルとファイル操作・権限 | 関連:パッケージとユーザー・SSHコンテナとは(名前空間・cgroups)

要点(BLUF)

概念 ── デーモンと「監督役」

Web サーバや DB のようにバックグラウンドで動き続けるプロセスがデーモンです。問題は「サーバ再起動後に自動で立ち上がるか」「クラッシュしたら誰が立て直すか」。これを担うのが systemd——Linux の起動直後から動く「全サービスの監督役(PID 1)」です。

flowchart TB
    boot["サーバ起動"] --> systemd["systemd(PID 1・監督役)"]
    systemd --> net["network.target(ネットワーク準備)"]
    systemd --> svc["myapp.service(自作アプリ)"]
    net --> svc
    svc -->|"クラッシュ検知"| restart["自動で再起動(Restart=always)"]
    restart --> svc

「プロセスとは何か」というOSの理論は コンピュータ基礎 へ。ここは「サービスとして運用する」実務に絞ります。

仕組み ── unit ファイルで宣言する

systemd は「どう動かすか」を unit ファイルに宣言的に書きます(命令の列ではなく、望ましい状態の記述)。

# /etc/systemd/system/myapp.service
[Unit]
Description=My App Server
After=network.target            # ネットワーク準備後に起動

[Service]
ExecStart=/usr/bin/python3 /opt/myapp/server.py
Restart=always                  # 落ちたら必ず再起動
RestartSec=3                    # 3秒待って再起動
User=appuser                    # root でなく専用ユーザーで動かす(最小権限)
WorkingDirectory=/opt/myapp

[Install]
WantedBy=multi-user.target      # 通常運用時に自動起動する

3つのセクションが肝。[Unit] で依存と説明、[Service] で実行方法と再起動方針、[Install] で「いつ自動起動するか」。After= の依存指定により、ネットワークが整う前にアプリが起動して失敗する、を防げます。

動く例 ── 起動・確認・ログ

# unitを置いたら systemd に読み込ませる
sudo systemctl daemon-reload
# 今すぐ起動
sudo systemctl start myapp
# サーバ再起動後も自動起動するよう有効化
sudo systemctl enable myapp
# 状態確認(active/failed、直近ログ、再起動回数が見える)
systemctl status myapp
# ログを追う(journald が標準出力を自動収集している)
journalctl -u myapp -f

ポイントは アプリは標準出力にログを吐くだけでよいこと。journalctl が unit ごとに収集・保管してくれるので、自前のログローテーションが要りません。この「標準出力にログを出す」習慣が、後のコンテナ(コンテナとは(名前空間・cgroups))でそのまま効きます。

なぜ systemd に任せるのか

⚠️ よくある誤解・落とし穴

対応ラボ

cloud-infra-study/labs/02-02_myapp.service02-02_server.py(最小HTTPサーバを systemd 風に常駐させ、Restart の挙動を観察する参照。Linux 環境で systemctl 実行)。

関連

第2章 Linux運用の基礎 目次