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



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

$ 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"脚本,以便在虚拟环境中执行该命令。在SO上已经向其他有同样问题的人建议了这种方法。

#!/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

更多信息。

最新更新