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

时间:2015-04-16 21:49:47

标签: django cron virtualenv

我正在使用Django Post Office在我的Django 1.6.2应用程序中发送电子邮件,但是我无法从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(这个用户拥有该项目),但我仍然得到同样的错误。

我还创建了以下'send-queued-mail-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'登录时,我也可以从命令行运行脚本中的命令,它们运行得很好。

1 个答案:

答案 0 :(得分:0)

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

您需要使用:

. venv/myproj/bin/activate

而不是:

source venv/myproj/bin/activate

More info