概要
botと言っても色々ありますが、今回は株式・仮想通貨の自動売買やギャンブルの自動投票などのbotを作っている人向けの話です。
やったことある人は分かると思いますが、こういったプログラムは、通信状況の悪化だったりページの遷移の遅延など、色々な理由でよく止まっちゃいます。
(公開APIを用いたものではなく、seleniumなどのスクレイピングツールを使用する場合は特に)
これが理由で損失が出ると悲しいので、なるだけ停止しないように対策をする必要があります。
ということで今回はpythonを用いて、停止しないbotを実装したいと思います。
方針と実装
方針としてはシンプルに、一定時間ごとにbotが正常に動いているかどうかを監視するというものです。
実装方法も簡単で、botの起動プログラムを実行しているprocessのステータスを定期的に取得し、停止していれば再起動をかけるようにする、という流れです。
ということで、早速スクリプトを書いてみます。subprocess
というモジュールを使います。
前提として、botを起動するスクリプトはあるものとします(下のスクリプト中のhoge_bot.py
)。
import argparse
import pandas as pd
import time
import subprocess
def main(check_interval=150):
"""
* 一定時間ごとにプロセスが動いているかどうかを確認するよ
* 引数の`check_interval`で確認の間隔(秒)を指定できるよ(デフォルトは150秒)
* `subprocess.Popen.poll()` で特定のプロセスのステータスコードを見れるよ.
- None >> 実行中
- 0 >> 正常に終了
- 1 >> 一般的なエラーで終了
"""
cmd = f'python hoge_bot.py' # botを起動するプログラムを実行するコマンド
proc = subprocess.Popen(cmd, shell=True) # ここでbot実行のプロセスを立ち上げる
iter_num = int(12 * 3600 / check_interval) # 12時間監視し続けるように繰返しの回数を設定
for _ in range(iter_num):
if proc.poll() is None:
print('still working') # ちゃんと動作していれば何もしない
else:
proc.kill()
proc = subprocess.Popen(cmd, shell=True) # 止まっていれば再起動する
print('rebooted')
time.sleep(check_interval)
print('ended')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-ci', '--check_interval', type=int, default=150)
args = parser.parse_args()
main(args.check_interval)
subprocess.Popen
でプロセス自体をオブジェクトとして受け取れるのは面白いですよね。
というわけで、今回は停止しないbot (正確にいうと停止しても大丈夫なbot)の作り方を自分なりに考えてみました。
今後bot作成に挑戦する際には、ぜひ参考にしてもらえると嬉しいです。