1. ホーム
  2. パイソン

[解決済み】Cronとvirtualenvについて

2022-04-17 12:08:13

質問

cronからDjangoの管理コマンドを実行しようとしています。私は自分のプロジェクトをサンドボックスに保つために virtualenv を使っています。

のようにvirtualenvの中から管理コマンドを実行している例を、ここなどで見かけました。

0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg

しかし、タスクが開始されるはずのsyslogがエントリを表示しているにもかかわらず、このタスクは実際には実行されません(スクリプトのログファイルは空っぽです)。シェルから手動でこの行を実行すると、期待通りに動作します。

現在、cronでコマンドを実行させる唯一の方法は、コマンドを分割して、馬鹿なbashラッパー・スクリプトに入れることです。

#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg

EDIT

arsは、動作するコマンドの組み合わせを思いつきました。

0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg

少なくとも私の場合は、virtualenvのactivateスクリプトを起動しても、何も起こりませんでした。これはうまくいったので、本番に臨みます。

解決方法は?

を使用することで、できるはずです。 python を仮想環境上で実行します。

/home/my/virtual/bin/python /home/my/project/manage.py command arg

EDIT: もしあなたの django プロジェクトが PYTHONPATH に入っていないなら、正しいディレクトリに切り替える必要があります。

cd /home/my/project && /home/my/virtual/bin/python ...

また、cronから失敗のログを取るようにすることもできます。

cd /home/my/project && /home/my/virtual/bin/python /home/my/project/manage.py > /tmp/cronlog.txt 2>&1

もうひとつは、同じ変更を manage.py スクリプトの一番上にあります。

#!/home/my/virtual/bin/python