Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在virtualenv中使用crontab自动化定制Django管理命令_Django_Cron_Manage.py - Fatal编程技术网

在virtualenv中使用crontab自动化定制Django管理命令

在virtualenv中使用crontab自动化定制Django管理命令,django,cron,manage.py,Django,Cron,Manage.py,我正在尝试在Django应用程序上运行自定义管理命令,该应用程序安装在虚拟环境下 */1 * * * * cd /home/myuser/myapp && source /home/myuser/.virtualenvs/myvirtualenv/bin/activate && /home/myuser/.virtualenvs/myvirtualenv/bin/python /home/myuser/myapp/manage.py mycommand --set

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

*/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
这个任务应该每分钟运行一次,我不太明白为什么它不工作

以下是我的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并运行管理命令。 同样,没有结果


我有点迷路了,因为我已经彻底搜索过了,我完全被卡住了,因为显然没有错误消息显示在任何地方。

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

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

在我的一个项目中处理完crontab之后,我开始使用(更具体地说是芹菜节拍)来完成我的定期任务。它的设置只是稍微复杂一点(您将需要一个消息代理,例如Redis),但之后它的功能要强大得多

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


为了管理芹菜工人和芹菜节拍流程,我建议使用

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

  • 如果您使用
    crontab-e
    创建了cronjobs,这将是您登录的用户的邮箱
  • 如果使用
    sudo crontab-e
    创建cronjobs,这将是根用户的邮箱
要阅读电子邮件,您必须设置电子邮件服务器和客户端。为此,
postfix
(服务器)和
mutt
(客户端)是非常流行的选项,许多好的教程都介绍了它们的安装

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


一旦设置好了,调试就会容易得多

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

*/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

应该适用于您的情况。

您的管理命令执行什么日志记录?你应该尽可能多地捕捉它,看看它在哪里爆炸,否则你会在盲目的情况下进行有效的调试。这是在什么环境下运行的?VPS/shared hosting?我的命令执行相当多的日志记录,但除非手动运行该命令,否则我无法看到任何日志记录。这让我想到我一定是把cron搞砸了,而不是命令。它是在VPS上运行的。是的。我担心我也必须走那条路。我已经花了大约2天的时间试图通过cron运行这个命令,但它似乎不是正确的方法。另一方面,芹菜吓坏了我,正是因为你提到的原因。不,那没有帮助。将stdout和stderr重定向到一个文件,例如,将
>/path/to/logfile 2>&1
附加到命令。然后您可能会在日志文件中看到问题所在。