#やったこと
Pythonとcrontabを使って、データファイル(pklフォーマット)を一週間に一回(土曜日の午後7時)に更新されるようにしました。
毎週更新されるデータをGithubに自動的にPushしたく、同じくcrontabを使ってやってみた。
#環境
- Linux Mint 19
- Python 3.6.9
- git 2.17.1
#GithubでSSH接続する
ssh接続する方法はたくさんネットに上がっているので割愛します。
(参考: GitHubにssh接続できるようにする)
#GITコマンドでプッシュしてみる
ssh接続が出来たら、gitコマンドでPushしてみる。
アップしたいデータファイルはplayers_data.pklというpythonのpickleというモジュールを使用したフォーマットです。
git add players_data.pkl
git commit -m "最初のコミット"
git remote add origin git@github.com:<ユーザー名>/<レポジトリ名>
git push origin master
#自動化のPythonコードを作成
この一連の作業を自動化するPythonのコードを書きます。
使用するのはsubprocessというModuleで、bashコマンドをPythonで実行することが出来ます。(参考:Python の subprocess)
import os
import datetime
import subprocess as cmd
#input values
new_date = datetime.datetime.now().strftime('%Y%m%d')
current_dir = os.getcwd()
#Subprocessで自動化
cp = cmd.run(f"git -C {current_dir} add players_score.pkl", check=True, shell=True)
cp = cmd.run(f"git -C {current_dir} commit -m 'scoresheet updated on {new_date}'", check=True, shell=True)
cp = cmd.run(f"git -C {current_dir} push origin master", check=True, shell=True)
print('Githubへのアップ成功!')
この段階でpython3 new_data.py
をbashで実行し、ちゃんとGithubにアップされているか確認してもよいでしょう。
#SSH のラッパースクリプト(git-ssh.sh)を作成
ここが今回引っかかったところなのですが、crontabでgit push origin masterを実行しようとすると、以下のようなエラーがでます。
Command 'git -C /path/to/folder/ push origin master' returned non-zero exit status 128.
cron から自動で git push するを参考にすると、
cron から自動で git push したい時、ssh の秘密鍵を明示的に指定して git push する必要があります。
というわけで以下のSHファイルを.sshのあるフォルダーに置いてやることが必要です。
#!/bin/sh
exec ssh -oIdentityFile=/path/to/.ssh/id_rsa "$@"
このSHファイルに実行権限を与えることも必要。
cd /path/to/.ssh
chmod +x git-ssh.sh
#SHファイルでPythonを動かす
直接Crontabでやってもいいのですが、今回はSHファイルを作成してPythonを動かすようにします。
#!/bin/sh
cd /path/to/folder
export GIT_SSH=/path/to/.ssh/git-ssh.sh
python3 new_data.py > output_newdata.txt
#crontabでSHファイルを定期的に実行する
最後にcrontabで定期実行の方法です。
まずcrontab -e
をbashで実行し、crontabを開けます。
Cronの設定の仕方は割愛しますが、毎週土曜日の午後7:00にscripts.shを定期実行したいときは下記のようにします。(参考:crontabのガイドライン)
00 19 * * 6 bash /path/to/folder/scripts.sh
これでうまく定期実行のできるようになりました。
#参考サイトまとめ