やりたかったこと

nginxやDockerを再起動したり、OS起動時に自動起動させたかった。 Linuxではsystemdでサービスの起動・停止・自動起動を管理する。

基本コマンド

# サービスを起動
sudo systemctl start nginx

# サービスを停止
sudo systemctl stop nginx

# サービスを再起動
sudo systemctl restart nginx

# 設定を再読み込み(停止せずに反映)
sudo systemctl reload nginx

サービスの状態を確認する

sudo systemctl status nginx

実行すると以下のような出力が得られる。

● nginx.service - A high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
     Active: active (running) since ...
  • active (running) → 起動中
  • inactive (dead) → 停止中
  • failed → 起動失敗

自動起動の設定

OS起動時にサービスを自動起動させるにはenableを使う。

# 自動起動を有効にする
sudo systemctl enable nginx

# 自動起動を無効にする
sudo systemctl disable nginx

# 現在の自動起動設定を確認
sudo systemctl is-enabled nginx

enabled と表示されれば自動起動が設定されている。

ログを確認する(journalctl)

# サービスのログを表示
sudo journalctl -u nginx

# 最新のログだけ表示
sudo journalctl -u nginx -n 50

# リアルタイムでログを追う
sudo journalctl -u nginx -f

# 今日のログだけ表示
sudo journalctl -u nginx --since today

カスタムサービスを作成する

自作スクリプトをsystemdのサービスとして登録できる。

sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target

[Service]
ExecStart=/home/user/myapp/start.sh
Restart=always
User=user
WorkingDirectory=/home/user/myapp

[Install]
WantedBy=multi-user.target

ファイルを作成したらデーモンをリロードしてから起動する。

# systemdに設定を再読み込みさせる
sudo systemctl daemon-reload

# サービスを起動して自動起動も設定
sudo systemctl enable --now myapp

よく使うコマンドまとめ

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

# 起動失敗したサービスだけ表示
sudo systemctl --failed

# サービス定義ファイルの場所を確認
sudo systemctl cat nginx

ハマったポイント

  • enable だけでは起動しない。start も別途実行するか enable --now を使う
  • カスタムサービスを追加・変更したら必ず daemon-reload が必要
  • ExecStart にはフルパスで指定する(/usr/bin/python3 など)
  • Restart=always を設定するとクラッシュ時に自動で再起動する
  • ログが溜まってディスクを圧迫する場合は journalctl --vacuum-time=7d で削除できる

サービスのリアルタイムログを確認したい場合は journalctl -u サービス名 -f か、Linuxでログをリアルタイム監視するtail -fの使い方を使う方法もある。

関連記事

おすすめのVPS/ドメイン

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。