systemdとサービス管理

systemdとは

systemd は、Linux の起動処理とサービス(常駐プログラム)の管理を担う仕組みです。現在の主要な [[Linux]] ディストリビューション(Ubuntu、RHEL 系など)のほとんどが採用しており、サーバー運用では避けて通れない基礎知識です。

Web サーバーやデータベースのようなサービス(バックグラウンドで動き続けるプログラム。デーモンとも呼ばれます)を、統一されたコマンドで起動・停止・監視できます。

systemctlコマンドの基本

サービスの操作は systemctl コマンドで行います。[[シェルとコマンドライン]] から次のように実行します。

sudo systemctl start nginx     # サービスを起動
sudo systemctl stop nginx      # サービスを停止
sudo systemctl restart nginx   # 再起動
sudo systemctl status nginx    # 状態を確認
sudo systemctl enable nginx    # OS起動時に自動起動させる
sudo systemctl disable nginx   # 自動起動を解除

特に重要なのが start と enable の違いです。start は「いま起動する」だけで、サーバーを再起動すると止まったままになります。enable で自動起動を設定して初めて、再起動後もサービスが立ち上がります。「start したのに再起動したら動いていない」は初心者が最初にはまるポイントです。

ユニットファイル

systemd はサービスをユニットという単位で管理し、その定義をユニットファイルに書きます。

[Unit]
Description=My App Server
After=network.target

[Service]
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=always
User=appuser

[Install]
WantedBy=multi-user.target
  • ExecStart — 起動するコマンド
  • Restart=always — プロセスが落ちたら自動で再起動する
  • After — ネットワーク準備後に起動する、といった順序の指定

自作のアプリもユニットファイルを書けば、[[ミドルウェア]] と同じように systemctl で管理でき、異常終了時の自動復旧まで任せられます。

初学者向けポイント

  • ログは journalctl -u サービス名 で確認できる。エラー調査の第一歩
  • サービスの実体は [[プロセスとスレッド]] で言うプロセス。systemd はプロセスの親玉として全サービスを見張っている
  • 古い教材に出てくる service コマンドや init.d は前世代の仕組み。現在は systemctl が標準

関連技術とのつながり

  • [[Linux]] — systemd は主要ディストリビューション標準のサービス管理基盤
  • [[シェルとコマンドライン]] — systemctl や journalctl はシェルから実行する
  • [[プロセスとスレッド]] — サービスの実体はプロセス。systemd がその生存を監視する
  • [[ミドルウェア]] — Nginx や MySQL などのミドルウェアは systemd のサービスとして動かすのが定番
Q: systemctl の start と enable の違いとして正しいのはどれ?
- [x] start はいま起動するだけで、enable は OS 起動時の自動起動を設定する
- [ ] start は自動起動の設定で、enable はいま起動するコマンド
- [ ] 両者はまったく同じ動作をする
解説: start は即時起動のみで再起動後は止まったままです。再起動後も動かすには enable で自動起動を設定します。

Q: ユニットファイルの Restart=always が意味するのはどれ?
- [ ] OS を毎日自動で再起動する
- [x] プロセスが落ちたらサービスを自動で再起動する
- [ ] サービスの起動を常に拒否する
解説: Restart=always を指定すると、プロセスの異常終了時に systemd が自動でサービスを立ち上げ直します。

Q: systemd で管理するサービスのログを確認するコマンドはどれ?
- [ ] ping -u サービス名
- [ ] npm run サービス名
- [x] journalctl -u サービス名
解説: journalctl -u サービス名 で該当サービスのログを確認できます。エラー調査の基本手順です。