通过虚拟环境运行 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 虚拟环境中运行时。它应该使用我的用户环境变量吗?来自虚拟环境的变量?如何实现?谢谢!

注意:如果有帮助,我有我的 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

这些取自这个问题,其答案可能为处于类似但不完全相同情况的人们提供其他想法。

相关内容