2019

2

12

CentOS7でpyenv環境のpythonコマンドをcron実行してやんよ!!!

スポンサードリンク


さくらVPSで構築したCentOS7でpythonファイルをcron実行する際にちょっと手間取ったので記録。

実行環境

・CentOS7
・httpサーバーはNginx
 (ドキュメント用のディレクトリは/usr/share/nginx/html/以下)
・pyenvでインストールしたpyenvの3.7.1


自動実行させるpythonファイルを作成

まずはcronで自動で実行させたいpythonファイルを作成します。
ファイルが実行されると「job.txt」にテキストを追記する簡単なテストコードですが、
実はここで結構詰まったのが同じディレクトリ内でもファイルを生成するようなパスを指定するコードを書いた際に実行がうまくいかなかったポイントとして、実行するカレントディレクトリは正式に絶対パスで書く必要があるようでした。

自動実行用ファイル「cron_test.py」

#coding:utf-8

# nginx環境下の「cron_test.txt」を開く(なければ新規作成)
f = open('/usr/share/nginx/html/job.txt','a')
# 実行する度にテキストを追記
f.write('cron実行したよー')

f.close()

「cron_test.py」を実行後、自動生成ファイルを確認

# 実行ディレクトリへ移動
$ cd /usr/share/nginx/html
$ ls
cron_test.py --> 実行ファイル以外はまだ何もない

# cron_test.pyを実行して確認
$ python cron_test.py
$ ls
cron_test.py job.txt  --> 「job.txt」が生成された

# 自動生成が確認できたので削除
$ sudo rm job.txt
手動ですが実行後に、ちゃんとファイルが生成できたので、これを実際にシステム側で自動実行できるようにします。


CentOS7でcronスケジュールを設定


CentOS7で標準に入っているクーロンはcronie-anacronですが、
cronie-anacronのままでは指定した時間ピッタリに実行されないとの事なので、
cronie-noanacronをインストールしてcronie-anacronは削除します
$ sudo su -
#yum -y install cronie-noanacron
#yum -y remove cronie-anacron

次に定期実行のジョブ設定
# cronデーモンの起動
$ sudo systemctl start crond
# cronデーモンの自動起動に設定
$ sudo systemctl enable crond

# cronのスケジュール設定
$ sudo vim /etc/crontab
---
# 毎時5分にadmin権限でpyenv経由でpythonコマンドで、「hello.py」のあるルート指定して実行
5 * * * * admin $HOME/.pyenv/shims/python /usr/share/nginx/html/cron_test.py
---

ここでも注意点なのはcron経由でpythonコマンドを実行させる場合は、システムにある生のpythonではなくpyenv環境で入れたpythonのあるパスで指定しないと動作しませんので、"which python"コマンドでpyenv経由で入っているpythonの場所を教えてもらいます

$ which python
~/.pyenv/shims/python

whichコマンドで返ってきたパスにある"~"も正確な位置ではないのでcrontabには"$HOME"で指定します。

cronにログファイル名を実行日時に設定する場合

日常的にスケジュールを実行させログファイルを固有のファイル名ではなく、実行日時で保存したい場合は
CentOS7の"date"関数を使って「20190212.log」というファイル名で保存
$ sudo vim /etc/crontab
---
5 * * * * admin $HOME/.pyenv/shims/python /usr/share/nginx/html/cron_test.py >> /usr/share/nginx/html/`date +\%Y\%m\%d`.log
---

これでサーバーを停止しない限りは寝てても勝手に実行してくれるようになります。やったね!

トップへ