☆☆ 新着記事 ☆☆

2019年5月27日月曜日

CRONでVirtualenvを立ち上げて、pythonアプリを定期的に実行する: CentOS 7


CRONを触るのが初めてですが、CentOSでcronで、指定した時間に

1) Virtualenvを立ち上げ、
2) pythonアプリを動かす

ことが、以下の設定で出来ました。 


cronで仮想環境を立ち上げてから、アプリを起動する

情報があまりなく、苦労したので、備忘として、まとめておきます。

良く参照する時間の設定だけ、ここに再掲。
crontab -u root -e
cronの設定を記述
分 時 日 月 曜日 <実行コマンド>

・固定指定
以下のように設定すると、15時になる度に実行。
0 15 * * * echo "hello."

・間隔指定
間隔を指定したい場合。
例では、5分毎に実行されます。

*/5 * * * * echo "hello."

・複数指定
複数時間を設定したい場合はカンマ(,)で区切ります。
例では、午前2時5分と午前2時10分に実行。

5,10 2 * * * echo "hello."

・範囲指定
複数指定よりも範囲で指定した方がいい場合があります。
 以下のようにすると、指定範囲で実行できます。
 例では、午前2時5分、午前3時5分、午前4時5分、午前5時5分に実行されます。

5 2-5 * * * echo "hello."
月曜-金曜
0 15 * * mon-fri echo "hello."



*****結論だけ知りたい方*****

crontabに以下の書式で記述することでアプリを実行できます。


◇毎日 13:00pm (JST)に実行。

* 13 * * * cd  [ 実行するpython executableのディレクトリまでのフルパス] &&
 [ 仮想環境のpythonまでのフルパス] [実行したいパイソンファイル名]  config/config.ini > /dev/null 2>&1

で、実現できます。 例えば、具体的には以下のような記述。

* 13 * * * cd  /var/www/html/app &&  /home/virtualenv/bin/python test.py  config/config.ini > /dev/null 2>&1

1) /var/www/html/app
このディレクトリに、実行したいpythonのアプリファイルを格納しています。

2)  /home/virtualenv/bin/python
使用したい仮想環境のpythonまでのフルパス

3) test.py
1)のディレクトリに格納している、実行するpyファイルです。



これでcronでVirtualenvを立ち上げて、Pythonを実行できるね。

参考)仮想環境を立ち上げる必要がない場合は、

* 13 * * * python3 /var/www/html/app/ test.py

という、分かり易い書き方になります。




*****以下、基本事項を確認しなら*****

cronの設定 手順

0. crondの状態確認

1)crond が動いているかどうか

systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2019-05-04 12:17:34 JST; 3 weeks 1 days ago  Main

PID: 13525 (crond)

2) crond 動いていなかったらOS起動時に Cron も自動起動するようにしておきす。
# systemctl enable crond.service (systemctl start crond)
#systemctl start crond.service (systemctl start crond)

2) crond ログの確認
tail -f /var/log/cron

1. CentOS 7 用の設定

CentOS7では初期設定でcronie-anacronがインストールされており、ジョブの実行時間に幅を持たせている。 指定日時ぴったりにジョブを実行したい場合、cronie-noanacronを入れる必要がある。
依存関係上先に、cronie-noanacronをインストールし、その後にcronie-anacronを削除する。

(確認)
[root@ueczshc7 ~]# yum list installed | grep cronie
cronie.x86_64                          1.4.11-17.el7              @base/7.4.1708
cronie-anacron.x86_64                  1.4.11-17.el7              @base/7.4.1708


# yum -y install cronie-noanacron
Installed:
  cronie-noanacron.x86_64 0:1.4.11-20.el7_6 Dependency Updated:
  cronie.x86_64 0:1.4.11-20.el7_6    cronie-anacron.x86_64 0:1.4.11-20.el7_6
Complete!

# yum -y remove cronie-anacron
Removed:
  cronie-anacron.x86_64 0:1.4.11-20.el7_6 Complete!

[root@ueczshc7 ~]# yum list installed | grep cronie
cronie.x86_64                          1.4.11-20.el7_6            @updates
cronie-noanacron.x86_64                1.4.11-20.el7_6            @updates


設定は/etc/cron.d/dailyjobsで行う。設定の確認。

$ cat /etc/cron.d/dailyjobs
[root@eowrirn3 ~]# cat /etc/cron.d/dailyjobs


# Run the daily, weekly, and monthly jobs if cronie-anacron is not installed

SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# run-parts
02 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly

cronie-anacronが削除されない場合は、実行されないようになっていることが分かる。


実行したいシェルは頻度に応じて/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthlyに配置する。配置後にcrondの再起動が必要。

$ sudo systemctl restart crond

ログは/var/log/cronに出力される
ログの確認。

$ sudo less /var/log/cron

(以上、https://qiita.com/satouf/items/38a4e01e5ac493a67eb2


****cronのログをvi で編集すると、ログが更新されなくなることがある。
そんな時は、
service rsyslog restart
を実行。


2. crontabの設定

1)参照
# crontab -l
10 * * * * /root/crontest.sh

2)編集
crontab -u root -e

3)記述方法
cronの設定を記述
分 時 日 月 曜日 <実行コマンド>

・固定指定
以下のように設定すると、15時になる度に実行。
0 15 * * * echo "hello."

・間隔指定
間隔を指定したい場合。
例では、5分毎に実行されます。

*/5 * * * * echo "hello."

・複数指定
複数時間を設定したい場合はカンマ(,)で区切ります。
例では、午前2時5分と午前2時10分に実行。

5,10 2 * * * echo "hello."

・範囲指定
複数指定よりも範囲で指定した方がいい場合があります。
 以下のようにすると、指定範囲で実行できます。
 例では、午前2時5分、午前3時5分、午前4時5分、午前5時5分に実行されます。

5 2-5 * * * echo "hello."

上記の書式で記述後、保存してエディタを閉じると設定完了です。

設定読み込み作業は不要で、保存すると自動で実行されるが、、

#設定ファイルの読み込み
#cronの設定を記述したファイルを読み込むことで、cronを設定できます。
#echo '*/5 * * * * echo "hello."' > cron.conf crontab cron.conf

crontabで、-rオプションを誤ってつけてしまうと、設定が全て消去されてしまいます。



3.仮想環境を起動して、Python実行

(手順)

* * * * * /usr/bin/env bash -c 'YOUR_COMMAND_HERE' > /dev/null 2>&1


◇記述例1 (bashでVirtualenvを起動させる方法)
0 3 * * * /usr/bin/env bash -c 'cd /var/www/html/app/ && source /home/virtualenv/bin/activate && ./test.py command arg' > /dev/null 2>&1


◇記述例2 (仮想環境下のPythonをポイントする方法)
0,30 * * * * cd /home/myuser/myproject && venv/bin/python bot.py config/config.ini > /dev/null 2>&1

◇適用例2

* * * * * cd  /var/www/html/app/ &&  /home/virtualenv/bin/python test.py  config/config.ini > /dev/null 2>&1

記述例3 (python app内に、仮想環境を起動するscriptを書き込む)

# coding: utf-8
activate_this ='/home/virtualenv/bin/activate_this.py'
exec(open(activate_this).read(), {'__file__': activate_this}) import sys sys.path.insert(0, '/var/www/html/app')

*****************************************

0 件のコメント:

コメントを投稿