透過虛擬環境執行 Django Python 命令的 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

答案1

有幾種方法可以解決這個問題:

首先,它不起作用,因為/bin/shcron 的 shell 用來運行命令,但/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,對於處於相似但不完全相同情況的人來說,其答案可能包含其他想法。

相關內容