我正在尝试从cron运行Django管理命令。我使用virtualenv保持我的项目沙盒。

我在这里和其他地方看到了从virtualenv中运行管理命令的示例,例如:

0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg

然而,尽管syslog显示了任务应该在何时启动的条目,但该任务从未实际运行(脚本的日志文件为空)。如果我从shell中手动运行这一行,它将按预期工作。

我目前可以通过cron运行命令的唯一方法是将命令分解并将它们放在一个哑bash包装脚本中:

#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg

编辑:

Ars提出了一个命令的工作组合:

0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg

至少在我的例子中,调用virtualenv的激活脚本没有任何作用。这招管用,所以节目继续。


当前回答

我很抱歉第n个答案,但我检查了答案,确实有更简单和整洁的答案。

长话短说

在你的cron中使用venv的python二进制文件:

0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py 

很长的故事

We activate the virtual environment when we want to set the current shell with the python config of that specific virtual environment(that is binaries and modules of that). It is relevant to work with the current shell : execute multiple python commands on the current shell without the need to reference the full python path of the venv. In the frame of a cron or even a bash, which value to activate the environment ? Besides I read in some answers some references to bash rather than sh or still to define a wrapper to call the Python code. But why the hell should we bother with these ?

重复一遍,照做就好:

0 3 * * * /home/user/project/env/bin/python /home/user/project/manage.py 

文件证实:

你不需要特别激活一个环境;激活 只需将虚拟环境的二进制目录前置到您的路径, 这样" python "就会调用虚拟环境的python解释器 您可以运行已安装的脚本,而不必使用它们的全部 路径。但是,在虚拟环境中安装的所有脚本都应该 在不激活它的情况下也可以运行,并使用虚拟机运行 环境的Python自动。

其他回答

从cronfile运行source将不起作用,因为cron使用/bin/sh作为它的默认shell,它不支持source。您需要设置SHELL环境变量为/bin/bash:

SHELL=/bin/bash
*/10 * * * * root source /path/to/virtualenv/bin/activate && /path/to/build/manage.py some_command > /dev/null

很难发现为什么会失败,因为/var/log/syslog没有记录错误细节。最好将自己别名为root,这样你就会收到带有任何cron错误的电子邮件。只需将自己添加到/etc/aliases并运行sendmail -bi。

更多信息: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html

上面的链接更改为: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/

你应该能够通过在虚拟环境中使用python来做到这一点:

/home/my/virtual/bin/python /home/my/project/manage.py command arg

编辑:如果你的django项目不在PYTHONPATH目录下,那么你需要切换到正确的目录:

cd /home/my/project && /home/my/virtual/bin/python ...

您也可以尝试从cron记录失败:

cd /home/my/project && /home/my/virtual/bin/python /home/my/project/manage.py > /tmp/cronlog.txt 2>&1

另一件要尝试的事情是在你的manage.py脚本最上面做同样的改变:

#!/home/my/virtual/bin/python

如果你和我一样是MacOS用户,你可以在/var/mail/{username}文件中查看crontab错误信息。像这样

tail /var/mail/{username}

如果出现“操作不允许”错误,也许你必须将cron添加到全磁盘访问应用程序(安全和隐私>隐私>全磁盘访问应用程序/execs)。

点击+按钮,转到/usr/sbin,双击cron文件。 然后它将修复“不允许”错误。详细步骤

这是我的代码:

0 19 * * * cd /Users/user/Desktop/Project && source /Users/user/Desktop/Project/venv/bin/activate && python command arg

与其在虚拟环境特定的shebangs上瞎折腾,还不如在crontab上预先加上PATH。

在激活的virtualenv中,运行这三个命令,python脚本就可以工作了:

$ echo "PATH=$PATH" > myserver.cron
$ crontab -l >> myserver.cron
$ crontab myserver.cron

crontab的第一行现在应该是这样的:

PATH=/home/me/virtualenv/bin:/usr/bin:/bin:  # [etc...]

在venv中添加Python安装路径,但不要激活环境。

* * * * * /HDD1/shritam_kumar/VENOM/venv/bin/python /HDD1/shritam_kumar/Projects/Voelkner-DE/schedule_product_BA.py

就是这么简单。