我正在尝试在我的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并运行管理命令。 再一次,没有结果。
我有点迷茫,因为我已经彻底搜索过,而且我完全陷入困境,因为显然没有任何错误消息显示在任何地方。
答案 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
应该适合您的情况。