やりたかったこと
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の使い方を使う方法もある。
関連記事
- Linuxの基本コマンド(ls/cd/mkdir/rm)まとめ
- Linuxのプロセス管理(ps/kill/top)
- LinuxでCronジョブを設定して定期実行する方法
- nginxの基本的な設定ファイルの書き方
おすすめのVPS/ドメイン
VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。