まずはcronで自動で実行させたいpythonファイルを作成します。
ファイルが実行されると「job.txt」にテキストを追記する簡単なテストコードですが、
実はここで結構詰まったのが同じディレクトリ内でもファイルを生成するようなパスを指定するコードを書いた際に実行がうまくいかなかったポイントとして、実行するカレントディレクトリは正式に絶対パスで書く必要があるようでした。
#coding:utf-8 # nginx環境下の「cron_test.txt」を開く(なければ新規作成) f = open('/usr/share/nginx/html/job.txt','a') # 実行する度にテキストを追記 f.write('cron実行したよー') f.close()
# 実行ディレクトリへ移動 $ 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で標準に入っているクーロンは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"で指定します。
日常的にスケジュールを実行させログファイルを固有のファイル名ではなく、実行日時で保存したい場合は 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 ---
これでサーバーを停止しない限りは寝てても勝手に実行してくれるようになります。やったね!