ubuntu systemdを使ってDiscord bot運用

Server

前回の記事でubuntu20.04でtmuxというアプリを使ってdiscord botファイルを運用する方法を紹介しました

今回はsystemdを使って運用する方法を紹介します

systemdを使って運用するメリットは、自動起動・管理が簡単なところです
特に、VPSで運用する場合、手動で起動する tmux や screen よりも systemd の方が適しています


systemd のメリット

  1. サーバーが再起動しても自動でBotが起動
    • tmux や screen は手動で再起動が必要
    • systemd は sudo systemctl enable discord-bot でOS起動時に自動実行
  2. プロセスが落ちても自動復帰
    • systemd は Restart=always を指定すると、Botがクラッシュしても自動再起動
    • nohup だと落ちたら手動で再起動が必要
  3. 管理が楽
    • sudo systemctl start/stop/status/restart discord-bot で簡単に管理
    • tmux や screen はセッション管理が面倒 (tmux attach など)
  4. ログ管理が統一される
    • journalctl -u discord-bot でログを確認できる
    • nohup のように別ファイル (bot.log) を作らなくてもよい
  5. セキュリティ向上
    • User=your-username でroot権限なしのユーザーで実行できる
    • WorkingDirectory を設定すれば、適切なディレクトリで動作する

使い分け

  • 開発中やデバッグ時 → tmux や screen で手軽に実行
  • 単発の実行や簡単な運用 → nohup でバックグラウンド実行

本番環境で 安定運用したいなら systemd が最適 です


systemdとは?

systemd(システムディー)は、Linux の initシステム(システムの起動・管理を行う仕組み)の一つで、プロセスやサービスの管理を担当する デーモン(バックグラウンドで動作するプログラム) です

簡単に言うと

  • OSの起動・シャットダウンを管理
  • サービス(Nginx, Discord Bot など)の起動・停止・監視を管理
  • ログ管理やリソース管理もできる

Ubuntu 20.04 ではデフォルトの init システムとして systemd が使われています

以前の Linux では SysVinit という仕組みが使われていましたが、systemd のほうが より高速で、柔軟で、管理しやすい ため、ほとんどの Linux ディストリビューションが systemd を採用しています。

systemd の特徴

  • 並列起動(サービスの起動を速くする)
  • 自動復帰(サービスが落ちても自動で再起動できる)
  • ログ管理(journalctl)
  • サービスの依存関係を管理(After=network.target など)
  • リソース制限(CPU・メモリ制限)

具体的にできること

1. サービス(daemon)の管理

Nginx や Discord Bot のようなサーバーアプリを systemd で管理できます

sudo systemctl start nginx       # Nginxを起動
sudo systemctl stop nginx        # Nginxを停止
sudo systemctl restart nginx     # Nginxを再起動
sudo systemctl status nginx      # Nginxの状態を確認

2. OS 起動時に自動でサービスを起動

sudo systemctl enable nginx   # OS起動時に自動起動
sudo systemctl disable nginx  # OS起動時の自動起動を無効化

3. 落ちたら自動再起動

Bot や Web サーバーがクラッシュしたとき、自動で再起動できます

/etc/systemd/system/discord-bot.serviceに以下の内容を記述します

[Service]
ExecStart=/usr/bin/python3 /path/to/bot.py
Restart=always

この設定で Bot がクラッシュしても systemd が自動で復活させます。

4. ログの管理

systemd は journalctl というコマンドでログを管理できます

sudo journalctl -u nginx --no-pager     # Nginx のログを確認
sudo journalctl -u discord-bot --tail   # Discord Bot のログを確認

Ubuntu 20.04 systemdでDiscard botを運用する方法

以下の手順でDiscard Bot を Ubuntu 20.04 で systemd を使って運用することができます

1. サービスファイルを作成

sudo nano /etc/systemd/system/discord-bot.service

discord-bot.service は任意の名前を変更することができます

  • 設定を記述
[Unit]
Description=My Python Bot
After=network.target

[Service]
ExecStart=/usr/bin/python3 /home/user/mybot/bot.py
WorkingDirectory=/home/user/mybot
Restart=alwa
User=myuser
Group=myuser
Environment="PYTHONUNBUFFERED=1"
StandardOutput=append:/var/log/mybot.log
StandardError=append:/var/log/mybot_error.log

[Install]
WantedBy=multi-user.target

各セクションの説明

  • [Unit]
    • Description=My Python Bot → サービスの説明
    • After=network.target → ネットワークが利用可能になった後に起動
  • [Service]
    • ExecStart=/usr/bin/python3 /home/user/mybot/bot.py → Botの実行コマンド
    • WorkingDirectory=/home/user/mybot → pythonファイルのある作業ディレクトリ
    • Restart=always → Botがクラッシュした場合に自動で再起動
    • User=myuser / Group=myuser → Botを実行するユーザー・グループ
    • Environment=”PYTHONUNBUFFERED=1″ → Pythonの出力を即時に反映
    • StandardOutput=append:/var/log/mybot.log → ログを /var/log/mybot.log に記録
    • StandardError=append:/var/log/mybot_error.log → エラーログを /var/log/mybot_error.log に記録
  • [Install]
    • WantedBy=multi-user.target → サーバー起動時に自動起動

ExecStart の /usr/bin/python3 がわからない場合や、仮想環境を使用している場合、は以下のコマンドで確認できます

which python

/home/user/mybot/bot.py にはPythonファイルのパスを入力します

ユーザー名、グループ名は以下のコマンドで確認できます
グループ名は複数でてくることもありますが、セキュリティ的に sudo 以外が良いと思います

#ユーザー名確認
whoami

#グループ名確認
groups ユーザー名

2. サービスの有効化と起動

サービスファイルを作成したら、以下のコマンドを実行します

  • systemd にサービスを認識させる
sudo systemctl daemon-reload
  • サービスを起動
sudo systemctl start mybot
  • サーバー起動時に自動起動するように設定
sudo systemctl enable mybot
  • サービスの状態を確認します
systemctl status mybot

出力が Active: active (running) になっていれば正常に動作しています


3. サービスの管理

以下にコマンドでサービスの管理ができます

  • 再起動
sudo systemctl restart mybot
  • 停止
sudo systemctl stop mybot
  • 自動起動の無効化
sudo systemctl disable mybot
  • ログ確認(リアルタイム)
journalctl -u mybot -f

5. トラブルシューティング

問題が発生したときは以下のコマンドでログを確認できます

journalctl -u mybot --no-pager --lines=100

パーミッションエラーが発生する場合は以下のコマンドを試してみて権限を付与して下さい

sudo chmod +x /home/user/mybot/bot.py

また、service ファイルの更新後は、以下のコマンドを実行して下さい

sudo systemctl daemon-reload

まとめ

以上のように VPS等を使用している場合は、sytemd を使用すれば安定的に bot 等のシステムを運用することができます

コメント