わたすけです。
最近VPSを契約したのですが、学校でプロキシからSSHできなかったり、たまに自宅PCからSSHできなくなることがあって割と困ってます。
さて、今回はタイトル通り、Pythonで書かれたDiscord用Botスクリプトをsystemdでサービス化する方法をまとめておきます。
環境
おなじみArch Linuxです(Alter Linuxじゃないので怒られそう)。ですが、systemdであれば多分同じだと思います。
使用したプログラムは自作のTimeTree-NoticeBotです。指定したTimeTreeカレンダーの予定を指定したDiscordチャンネルに送信してくれる便利なやつです。
プログラムはこれである必要はないと思いますが、この記事は「pipでインストールしたdiscord.pyを使用している」「Pythonで書かれている」ことが前提です。
確認事項
- ファイルの1行目に
#!/usr/bin/python
みたいなものを書いておく(TimeTree-NoticeBotは#!/usr/bin/env python
と記述されています) - chmodでスクリプトを実行可能にしておく(
chmod 755 スクリプト名.py
) - スクリプトを/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をサービス化する記事がないはずなので、この記事が誰かの参考になればいいな~と思います。
コメント