🎓 レベル:標準 | 重要度:A(必須)
📎 前提:シェルとファイル操作・権限 | 関連:パッケージとユーザー・SSH・コンテナとは(名前空間・cgroups)
要点(BLUF)
- サーバで動き続けるプログラムを**デーモン(常駐プロセス)**と呼ぶ。Linux で「いつ起動し・落ちたら再起動し・何に依存するか」を束ねるのが systemd。
- サービスは unit ファイル(宣言的なテキスト)で定義する。
systemctlで起動・停止・状態確認、journalctlでログを見る。 - 「落ちたら自動で立て直す(Restart)」をOSレベルで保証できるのが systemd の価値。手作業の見張りを不要にする。
概念 ── デーモンと「監督役」
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 に任せるのか
- 自己修復をOSが保証するため:
Restart=alwaysで、クラッシュしても人手を介さず立て直す。SRE の自己修復(キャパシティと信頼性設計)の最小単位。 - 依存順序を宣言で表すため:
After=で「DB が起きてからアプリ」を保証。起動順の手続きを書かずに済む。 - 専用ユーザーで動かすため:
User=で root を避け、被害範囲を絞る(シェルとファイル操作・権限 の最小権限)。
⚠️ よくある誤解・落とし穴
- 「
Restart=alwaysを付けたのに再起動が止まる」→ 短時間に連続クラッシュするとStartLimitで打ち止めになる。設定値を確認し、根本原因(設定ミス等)を直す。 - 「ログがどこにあるか分からない」→ 標準出力に出していれば
journalctl -u <名前>。自前でファイルに書くより journald に任せる方が楽。 - 「root で動かす」→ 乗っ取られたとき被害が最大化。
User=で専用ユーザーに。 - 「unit を直したのに反映されない」→
systemctl daemon-reloadを忘れている。編集後は必ず reload。 - 「
startしたから次回起動も自動」→startは今回だけ。永続化はenable。両者は別物。
対応ラボ
cloud-infra-study/labs/02-02_myapp.service + 02-02_server.py(最小HTTPサーバを systemd 風に常駐させ、Restart の挙動を観察する参照。Linux 環境で systemctl 実行)。
関連
- 動かすユーザーと権限は シェルとファイル操作・権限
- ソフトの導入とログイン管理は パッケージとユーザー・SSH
- 「隔離したプロセス」としてのコンテナは コンテナとは(名前空間・cgroups)
- 落ちても立て直す信頼性設計は キャパシティと信頼性設計