在virtualenv中使用crontab自动执行自定义Django管理命令

时间:2016-03-22 20:05:29

标签: django cron manage.py

我正在尝试在我的Django应用程序上运行自定义管理命令,安装在虚拟环境下。

这项任务应该每分钟运行一次,我无法弄清楚它为什么不起作用。

这是我在crontab中的内容:

*/1 * * * * /home/myuser/.virtualenvs/myvirtualenv/bin/python /home/myuser/myapp/manage.py mycommand --settings=myapp.settings

这不起作用,即使我在/var/log/syslog中看到命令每分钟执行一次,但它必须失败,因为它不起作用。

如果我只是复制并运行相同的命令,一切顺利。

然后我尝试运行外部bash脚本,如果我手动运行它再次完美地运行:

*/1 * * * * source /home/myuser/myapp/myscript

该脚本激活virtualenv并运行管理命令。 再一次,没有结果。

我有点迷茫,因为我已经彻底搜索过,而且我完全陷入困境,因为显然没有任何错误消息显示在任何地方。

4 个答案:

答案 0 :(得分:1)

问题可能是myapp.settings不在您的Python路径上。我会先尝试更改目录:

*/1 * * * * cd /home/mysuser/myapp && /home/myuser/.virtualenvs/myvirtualenv/bin/python manage.py mycommand --settings=myapp.settings

答案 1 :(得分:0)

在我的一个项目中自己摆弄crontabs后,我开始使用Celery(更具体地说是Celery Beat)来完成我的周期性任务。设置起来有点复杂(你需要一个消息代理,例如Redis),但事后它会更加强大。

即使您不使用异步任务执行,管理cron作业的便利性也值得设置。通过使用函数装饰器可以简单地在项目代码中定义作业,无需编辑服务器上的crontab。

为了管理芹菜工作者和芹菜节拍过程,我建议使用supervisord

答案 2 :(得分:0)

之所以没有显示错误消息是因为cron通过电子邮件将它们发送到正在执行crontab的用户的邮箱中。

  • 如果您使用crontab -e创建了cronjobs,则它将成为您登录时所用用户的邮箱。
  • 如果您使用sudo crontab -e创建了cronjobs,则它将成为root用户的邮箱。

要阅读电子邮件,您必须设置电子邮件服务器和客户端。为此,postfix(服务器)和mutt(客户端)是非常受欢迎的选项,许多好的教程都介绍了它们的安装。

请确保区分通过mutt打开的登录用户的邮箱和需要sudo mutt的根用户的邮箱。

设置完成后,调试会容易得多。

答案 3 :(得分:0)

我有类似的问题。我的代码无法从设置文件中获取任何变量。更改目录并激活虚拟环境后,此问题已修复。

*/1 * * * * cd /home/myuser/myapp && source /home/myuser/.virtualenvs/myvirtualenv/bin/activate && /home/myuser/.virtualenvs/myvirtualenv/bin/python /home/myuser/myapp/manage.py mycommand --settings=myapp.settings

应该适合您的情况。