activate(source env / bin / active)を使用する必要があるcrontabからPythonスクリプトを呼び出すにはどうすればよいですか?
2 に答える
Virtualenv の activate スクリプトは非常に単純です。ほとんどの場合、virtualenv の Python インタープリターへのパスを設定します。対話型シェルを使用していない場合、それが行う他のこと (設定PS1
、古い変数の保存など) は実際には必要ありません。したがって、最も簡単な方法は、正しい Python インタープリターを使用して Python スクリプトを起動することです。これは、次の 2 つの方法のいずれかで実行できます。
1. virtualenv の Python インタープリターを使用するように Python スクリプトをセットアップします。
virtualenv のインタープリターが にあると仮定すると、~/virtualenv/bin/python
そのパスを Python スクリプトの先頭に置くことができます。
#!/home/user/virtualenv/bin/python
そして、通常どおり、crontab からスクリプトを起動します。
2. cronjob で適切な Python インタープリターを使用してスクリプトを起動します。
スクリプトが に~/bin/cronjob
あり、virtualenv の Python インタープリターが にあると仮定すると~/virtualenv/python
、これを crontab に入れることができます。
* * * * * /home/user/virtualenv/python /home/user/bin/cronjob
私のアプローチは、常にcrontabをできるだけシンプルに保ち、crontab によって呼び出されるスクリプト内のすべての構成を処理することです。
1) シェル スクリプトを作成します。例: /var/webapp/cron.sh
#!/bin/sh
PATH="/var/webapp/.env/bin:$PATH"
export PATH
cd /var/webapp/
python test.py
/var/webapp/.env/binは virtualenv の場所です。PATH を設定すると、source ../activate を実行する必要がなくなります
2) 環境を適切に設定します。たとえば、Django アプリケーションの場合:
#!/usr/bin/env python
import os
from datetime import datetime
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.production'
os.environ['DJANGO_CONF'] = 'settings.production'
from util.models import Schedule
dset = Schedule.objects.all()
for rec in dset:
print rec
print 'cron executed %s' % datetime.today()
この例では、django の設定は settings/production.py にあります。
3) 最後に、/etc/crontab を編集します。たとえば、毎日 30 分ごとに実行するには、次のようにします。
1,31 * * * * root /var/webapp/cron.sh >> /var/webapp/cron.log
エラーの発見やメッセージのデバッグに役立つログを生成することが重要であることに注意してください。