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 サービス名 で該当サービスのログを確認できます。エラー調査の基本手順です。