如何让Django虚拟环境命令作为cron作业运行?

如何让Django虚拟环境命令作为cron作业运行?,django,cron,virtualenv,Django,Cron,Virtualenv,我使用Django 1.6.2应用程序发送电子邮件,但在从crontab文件执行DPO的“send_queued_mail”命令时遇到问题。我希望命令每分钟执行一次。这是我的第一个由root用户拥有的cron作业: $ sudo crontab -e * * * * * . /home/myproj/venv/swing/bin/activate && /home/myproj/venv/myproj/bin/python /www/myproj/manage.py send_q

我使用Django 1.6.2应用程序发送电子邮件,但在从crontab文件执行DPO的“send_queued_mail”命令时遇到问题。我希望命令每分钟执行一次。这是我的第一个由root用户拥有的cron作业:

$ sudo crontab -e
* * * * * . /home/myproj/venv/swing/bin/activate && /home/myproj/venv/myproj/bin/python /www/myproj/manage.py send_queued_mail >> /var/log/send_mail.log 2>&1
当我检查/var/log/syslog时,我可以看到该命令,它似乎正在正常执行。但是,我在send_mail.log文件中看到此错误:

Unknown command: 'send_queued_mail'
Type 'manage.py help' for usage.
我突然想到问题是,因为这是root的cronjob,所以我正在尝试为root激活一个不存在的虚拟环境。因此,我将上面的命令移动到myproj用户的crontab中,该用户拥有该项目,但我仍然得到相同的错误

我还创建了以下“发送队列邮件cronjob”脚本,以便在虚拟环境中执行该命令。这里已经向其他有同样问题的人建议了这种方法

#!/bin/sh
cd /home/myproj
source venv/myproj/bin/activate
venv/myproj/bin/python /www/myproj/manage.py send_queued_mail >> /var/log/send_mail.log 2>&1
我通过用户“myproj”拥有的cronjob将其称为:

* * * * * /www/myproj/bin/send-queued-mail-cronjob
但是,当它运行时,我仍然得到与以前相同的“未知命令错误”

我还有别的事要做吗?我可以从命令行执行第一个cronjob中的命令,而不会出错。当我以用户“myproj”的身份登录时,我也可以从命令行运行脚本中的命令,它们运行得很好。

source命令不适用于香草sh或Ubuntu的dash

您需要使用:

. venv/myproj/bin/activate
而不是:

source venv/myproj/bin/activate

.

venv是否与sh一起工作?请参阅:不相关,但我认为您的第一个cron作业命令中有一个输入错误:2>&!而不是2>&1@help_asap谢谢,这是一个输入错误。@jmunch我读了你提到的帖子,但我的服务器上没有virtualenv_activate.sh命令。virtualenv命令已安装到/usr/local/bin中,但那里没有此类文件。您是否在服务器的/usr/local/bin中搜索了virtualenv_activate.sh?您是否尝试过在整个服务器中查找它,例如使用find、which等命令?只是为了确保你真的没有它,我试过使用bashshell和它的。命令,但我仍然得到未知的命令错误。