我有一个 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。这些取自关于 SO 的这个问题,对于处于类似但不完全相同的情况的人,其答案可能包含其他想法。