どーも!
たかぽんです!
最近記事を書けていなかったので、久しぶりにリハビリしていきます...!
実は筆者、最近仮想通貨周りで一つbotを作りました...!
その際にpythonで簡単なコードを書いてcronで動くようにしたので、それについて解説できればなと思います。
今回、cronを用いるため、おそらくwindowsの方はそのままでは実行できないかと思います...
(最終的に別途サーバーを用意して実行する際、サーバー側のOSを正しく選択すれば実行することは可能です。動作確認がlocalではできないけども...)
やりたいこと
さて、ではまずはやりたかったことなんですが、筆者の場合は仮想通貨のGamiFi(詳細は割愛しますが...ポチポチゲームと思ってもらっていいかな...)を触っていて、定期的にクエストのようなことをこなさないといけなかったんですね。
スタミナが回復したらクエスト〜みたいなやつなんですが、それがおよそ8時間程度ごとにやる必要がありました。
通常のゲームならめんどくさいなー、まぁ、ちょっとくらい溢れてもいいかぁ〜で済ませるんですが...
ことGamifiだと、自分の資金を投資してリターンを得る必要があるので、"スタミナ溢れ"="損失"になります...
これはいかんぞ!と、botを作って定時で何かの言語でプログラムを動かしたい...!となったわけですね...!
実際は色々複雑なコード書いていますが、今回は簡単なHelloWorldにしておき、そのプログラムが定時で実行されるところをゴールにしたいと思います。
いったんはローカルで、そして別記事にてサーバーをレンタル(有料)して、そのサーバー上で動かすところまで踏み込んでいきます。
pythonの実行するプログラムを用意する
では、今回は筆者的に手軽にできるということでpythonを採用しました。
homebrewにて、以下, python3をインストールし、バージョンを確認します。
// homebrewでinstall
% brew install python
// version確認
% python3 -V
Python 3.8.5
入っているのが確認できたら、
任意のフォルダにてtest.pyとファイルを作成し、その中に以下を記載します。
print("Hello World!")
ほんとに単純で"Hello World!"と出力しているだけですね。
そしたら、test.pyを作成したフォルダ上で以下を実行します。
% python3 test.py
Hello World!
これで、"python3 test.py"というコマンドを実行すればHello World!と表示されることが確認できましたね!
では、次はcronの設定をしていきます...!
MacのCronを設定する
さて、cronの設定をしていきます。
これが結構曲者なんですよね...
手順としては以下になります。
- "crontab -e" でcronの設定画面を開く(vimでの編集)
- "i"を押してINSERTモードへ
- cronの設定を記述
- ecsでINSERTモードを解除
- ":wq"と入力して入力内容を保存して終了 (場合によっては環境設定で権限が必要になるので許可)
難しいので上記をおこなっている動画用意しておきました。
ご参考ください。
(画面下部も説明に使っているので、再生後、マウスを動画枠から離すといいかもです...シークバーが邪魔...)
ざっくりとこのような形です。
上記動画では解説忘れてましたが、-lオプションで中身を見ることができるので、ちゃんと書き込まれたか確認しておくと良いでしょう。
(base) taka@Taka python % crontab -l
* * * * * python3 /Users/taka/Practice/python/test.py >> /Users/taka/Practice/python/test.log
cronで指定する内容は以下のような形にしています。
* * * * * python3 /Users/taka/Practice/python/test.py >> /Users/taka/Practice/python/test.log
前半部分の以下は、test.pyというプログラムをpython3で実行し、cronの設定で毎分実行する...という内容になっています。
実行ファイルにフルパスを付けていますが、筆者の場合、pythonディレクトリ以下に今回のテスト用ファイル(test.py)を作成したので、pythonディレクトリにて"pwd"コマンドを打つことでサクッとフルパスがわかるかと思います。
* * * * * python3 /Users/taka/Practice/python/test.py
// テストファイルのフルパスは以下で探すと楽
(base) taka@Taka python % ls
test.py
(base) taka@Taka python % pwd
/Users/taka/Practice/python // /Users/taka/Practice/python/test.py がフルパスとわかる
そして、cronの標準出力はmail?として書き出されてしまうようでした。
そのため、今回は別ファイルにログとして書き出す...ことにより、動いていることを確認しようと思います。
その書き出しをしているのが後半部分です。
>> /Users/taka/Practice/python/test.log
上記により、前半部分(test.py)の出力をそのままtest.logへ書き出す...という内容になります。
こうすることで、test.logは毎分"Hello World!"と書き込みが行われるはずです。
では最後に動作確認をしましょう!
おそらくそう時間が経たないうちにtest.logというファイルができると思います。
lsコマンドでファイルがあることを確認したら、tailコマンドを使って、ファイルの中身をリアルタイムに追いかけてみましょう...!
(base) taka@Taka python % ls
test.log test.py
(base) taka@Taka python % tail -f -n 5 test.log
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
...
一分ごとに自動で追加されていく
...
上記のように待っているとHelloWorld!と書かれていくのが確認できればバッチリです!
これで、pythonを定期で実行することができました!
もしPCをつけっぱなしにできるのであれば、これだけで大半のことは自動化できるんじゃないかなと思います....!
cronの設定を戻しておくのを忘れずに...!
さて、それでは最後に終わる前にcronの設定を削除して戻しておきましょう。
あくまでテストだったので、永遠にログを吐かれてメモリを圧迫されるのも嫌ですからね...!
先程と同様に、crontab -eにて、設定を開き、insertモードで削除して保存をすればOKです。
また、テスト用ファイル・ログファイルは別記事で解説する外部のサーバーで動かす際に使う予定です。
もしそこまではいいかな?っていう方は削除してもOKです!
ローカルでのデメリット
さて、今回はローカル(手元のPC上)で定期実行を行えるようにしました。
このローカルで実行する...というのは、PCが稼働している時しか行えません。
なので、一度PCを閉じると、定期実行もされなくなります。(スリープや電源を落とす)
な〜んかそれだとかゆいところに手が届かないですよね...
そのため、次回は外部のVPS(virtual private server)を使って、ローカルではなく、いつも稼働してくれるサーバー上で動かし続ける...!
ということをやっていきます。
是非、興味ある方は次回もお会いしましょう...!
それでわ!