Pythonで書かれたDiscord用Botスクリプトをsystemdでサービス化する

Linux

わたすけです。

最近VPSを契約したのですが、学校でプロキシからSSHできなかったり、たまに自宅PCからSSHできなくなることがあって割と困ってます。

さて、今回はタイトル通り、Pythonで書かれたDiscord用Botスクリプトをsystemdでサービス化する方法をまとめておきます。

スポンサーリンク

環境

おなじみArch Linuxです(Alter Linuxじゃないので怒られそう)。ですが、systemdであれば多分同じだと思います。

使用したプログラムは自作のTimeTree-NoticeBotです。指定したTimeTreeカレンダーの予定を指定したDiscordチャンネルに送信してくれる便利なやつです。
プログラムはこれである必要はないと思いますが、この記事は「pipでインストールしたdiscord.pyを使用している」「Pythonで書かれている」ことが前提です。

確認事項

  1. ファイルの1行目に#!/usr/bin/python みたいなものを書いておく(TimeTree-NoticeBotは #!/usr/bin/env python と記述されています)
  2. chmodでスクリプトを実行可能にしておく(chmod 755 スクリプト名.py
  3. スクリプトを/optに移動させておく(自分は/opt/TimeTree-NoticeBotにmain.pyとsettingsファイルを置いています)

それでは肝心のサービス作成に入ります。

サービスの作成

touchコマンドなり、nanoなりvimなりで/etc/systemd/systemに「(任意の文字列).service」というファイルを作成し、編集します。

今回は「bot.service」という名前で作ることにします。

設定ファイルの編集

以下のような内容にします。

[Unit]
Description = TimeTree notice bot for discord

[Service]
ExecStart = /opt/TimeTree-NoticeBot/main.py
WorkingDirectory = /opt/TimeTree-NoticeBot
Environment=PYTHONPATH=/home/watasuke/.local/lib/python3.9/site-packages
Type = simple

[Install]
WantedBy = multi-user.target
  • Description
    説明欄です。お好きに書いてください。
  • ExecStart
    スクリプトのパスを記述します。
  • WorkingDirectory
  • 基本的にはいらないと思います。自分はsettingsファイルの読み込みに(おそらく)必要だったため記述しています。
  • Environment
    ここではdiscord.pyの場所を指定しています。
    pip show discord コマンドを実行し、表示された文章の中から「Location」を探し、そのパスをPYTHONPATH=に続けて記述してください。

その他はおそらくこのままにしておいて大丈夫だと思います。

サービスの起動

編集が終わったら、いつも通りsystemctl start bot.service で起動すると思います。systemctl status bot.service で動作しているかどうか確かめてください。

起動したときに自動でサービスを開始するときはsystemctl enable bot.serviceです。

躓いたところ

そもそもdiscord.pyが読み込めなくてずっと出来なかったんじゃないかと思ってはいたのですが、設定ファイルにRestart = always を記述していたため、”discord.pyが読み込めなくて失敗→Restartによって再起動” を繰り返す→短時間で再起動しすぎたのでサービスが強制停止される→ステータスに「短時間で再起動し過ぎだよ」としか書かれていないので原因の特定が不可能
ということでした。かなしい仕様ですね。Restartの設定には気をつけましょう。

ちなみにそもそものdiscord.pyが読み込めない問題はこのページを参考にして解決しました。ありがたや。

終わりに

ということで、ずっとやり方が分からずに放っておいたBot常駐がやっと成功してよかったです。
ちなみに、この方法を見つけるまでは毎朝起きてパソコンを起動した時に毎回Botを起動していました。ラズパイを買ってからは毎朝起動する必要はなくなったのですが、たまに再起動したときに起動を忘れて、そういえば動いてない!!!と頻繁になっていました。自動化はすばらしいですね。

あんまりネットにPython+discord.pyで作成したbotをサービス化する記事がないはずなので、この記事が誰かの参考になればいいな~と思います。

コメント

タイトルとURLをコピーしました