我有一个 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 虚拟环境中运行时。它应该使用我的用户环境变量吗?来自虚拟环境的变量?如何实现?谢谢!
注意:如果有帮助,我有我的 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 用来运行命令的 shell,但/bin/sh
不支持。所以快速修复是在 crontab 中source
设置。SHELL=/bin/bash
或者...
其次,没必要source virtualenv/bin/activate
这么做。你可以直接调用virtualenv python。
* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand
这些取自这个问题,其答案可能为处于类似但不完全相同情况的人们提供其他想法。