仮想環境を介して Django Python コマンドを実行する cron ジョブが機能しない

仮想環境を介して Django Python コマンドを実行する cron ジョブが機能しない

プロジェクトの仮想環境をロードした後に Django コマンドを実行する crontab ファイルがあります。

*/1 * * * * source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand

...しかし、まったく何も起こりません。cron ログには特に問題は出力されません。

Mar 13 19:51:01 110 CRON[23807]: (root) CMD (source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand)

言うまでもなく、コマンド自体はシェルにコピー&ペーストすると完璧に機能します。

これは crontab の環境変数に関連していることはわかっていますが、この問題についてはまったく知識がないので、特に Python 仮想環境で実行する場合、何をすればよいのかまったくわかりません。ユーザー環境変数を使用する必要がありますか? 仮想環境のものですか? それを実装するにはどうすればよいですか? ありがとうございます!

注意: 役に立つかもしれないので、crontab 環境変数の出力を以下に示します (crontab を介して「env」をファイルにエクスポートする場合)。

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
LC_ALL=en_US.UTF-8
PWD=/root

プロジェクトの仮想環境下では次の環境変数が使用されます。

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=x.x.x.x 53007 22
OLDPWD=/root/production/mydjangoproject
SSH_TTY=/dev/pts/0
LC_ALL=en_US.UTF-8
USER=root
VIRTUAL_ENV=/home/virtualenvs/mydjangoproject-venv
MAIL=/var/mail/root
PATH=/home/virtualenvs/mydjangoproject-
venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=(mydjangoproject-venv)${debian_chroot:+($debian_chroot)}\u@$(hostname -f):\w\$ 
SHLVL=1
HOME=/root
LS_OPTIONS=--color=auto --group-directories-first
LOGNAME=root
SSH_CONNECTION=x.x.x.x 53007 x.x.x.x 22
LC_CTYPE=en_US.UT

答え1

これを解決するにはいくつかの方法があります:

/bin/shまず、は cron がコマンドを実行するために使用するシェルですが、/bin/shをサポートしていないため機能しませんsource。そのため、簡単な修正方法はSHELL=/bin/bashcrontab で設定することです。

または...

2 番目に、いずれにしても必要ありませんsource virtualenv/bin/activate。virtualenv python を直接呼び出すことができます。

* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand

これらはSOのこの質問その答えには、状況が似ているが完全に同じではない人々のための別のアイデアが含まれている可能性があります。

関連情報