Cron
通過虛擬環境執行 Django Python 命令的 Cron 作業不起作用
我有一個 crontab 文件,據說在載入項目虛擬環境後執行 Django 命令:
*/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)
不用說,當在 shell 中複製粘貼時,命令本身可以完美執行。
我知道它與我的 crontab 的環境變數有關,但我對這個問題非常缺乏教育,我不知道該怎麼做,尤其是當它在 python 虛擬環境下執行時。它應該使用我的使用者環境變數嗎?來自virtualenv的那些?如何實施?謝謝!
注意:如果有幫助,我的 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
有幾種方法可以解決這個問題:
首先,它不起作用,因為
/bin/sh
shell cron 用於執行命令,但/bin/sh
不支持source
. 所以快速修復是SHELL=/bin/bash
在 crontab 中設置。或者…
source virtualenv/bin/activate
其次,無論如何都沒有必要。您可以直接呼叫 virtualenv python。* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand
這些取自關於 SO 的這個問題,對於處於類似但不完全相同的情況的人,其答案可能包含其他想法。