我需要帮助使用 django_cron
I need help using django_cron
我目前正在使用 HDFS、Apache Livy 和 Django,其目的是发送请求以获取存储在 HDFS 中并调用 Livy 来创建批处理的一些代码 运行。现在,一切正常,我有一个基本的 wordcount 存储在 HDFS 中,带有一个 .txt 文件,在一个 html 页面上,我只有一个简单的按钮可以单击以启动整个过程。
我成功创建了字数统计结果,我的下一步是从 Livy 获取信息,例如当前会话(或批次)的 ID starting/running/dead/success 某种回调,但我需要它自我实现,这样我就可以知道每个会话处于什么状态。为此,我想我可以使用 Django-cron,因此我无法正确设置它。我没有错误,但没有更多的事情发生。我错过了什么?
目前在 Centos7 上工作,但我在 Python 3.6 中使用 Conda 环境,Django 最新版本,livy 和 HDFS(最新版本)也是如此
这是我当前的文件:
livy.html
{% load static %}
<html>
<body>
<div id="div1">
{{result.sessions}}
</div>
<form action="#" method="get">
<input type="text" name="mytextbox" />
<input type="submit" class="btn" value="Click" name="mybtn">
</form>
</body>
</html>
views.py
from django.shortcuts import render
from django.http import HttpResponse
from django_cron import CronJobBase, Schedule
import wordcount, livy
# Create your views here.
class CheckIdCronJob(CronJobBase):
RUN_EVERY_MINS = 1 # every minute
schedule = Schedule(run_every_mins=RUN_EVERY_MINS)
code = 'button.CheckIdCronJob' # a unique code
def index(request):
if(request.GET.get('mybtn')):
r = livy.send(request.GET.get('mytextbox')) #(/test/LICENSE.txt)
return render(request,'button/livy.html', {'result':r})
return render(request,'button/livy.html')
livy.py
import json, pprint, requests, textwrap
def send(inputText):
host = 'http://localhost:8998'
data = {"file":"/myapp/wordcount.py", "args":[inputText,"2"]}
headers = {'Content-Type': 'application/json'}
r = requests.post(host + '/batches', data=json.dumps(data), headers=headers)
r = requests.get(host + '/batches' + '', data=json.dumps(data), headers=headers)
return r.json()
django-crontab 所做的只是让编写 运行 作业的管理命令变得容易,并指定 often/when 这些作业应该如何 运行。您最终得到一个管理命令 ./manage.py runcron
,它将检查您的所有作业,并在需要时 运行 检查它们。
它不做的是连续 runcron
,如果您想确保在正确的时刻工作 运行,这正是您真正需要的。基本上,例如,您希望每分钟 runcron
到 运行(或者如果时间不是每 10 分钟那么关键),那么您仍然需要使用一些系统守护程序来执行此操作。
crontab
在 CentOS 上可用,可用于此目的。 django-crontab 的安装向您展示了如何创建一个每 5 分钟 运行 runcron
的 crontab 的示例:
crontab -e
*/5 * * * * source /home/ubuntu/.bashrc && source /home/ubuntu/work/your-project/bin/activate && python /home/ubuntu/work/your-project/src/manage.py runcrons > /home/ubuntu/cronjob.log
您必须调整它以适合您的用例:
如果您只执行 crontab -e ...
作业将 运行 作为您当前登录的用户。该用户可能不是 运行 manage.py
命令的正确用户,因为该用户需要对 运行 您的项目具有正确的权限。使用 -u user
为不同的用户制作 crontab。
在生产环境中 运行 这实际上是一件复杂的事情:获得正确的用户权限并让正确的用户 运行 执行各种任务。通常你会有一个www-data
或apache
用户运行你的服务器(因此django应用程序)并且你希望同一个用户运行 manage.py
命令。它不应该是 root
运行ning apache,因为这会带来安全风险(您的网络服务器将拥有对整个系统的完全访问权限)。
- 以上命令来源 .bashrc 以确保环境变量设置正确。 /home/ubuntu/ 只是用户
ubuntu
的用户主目录。适当地改变它。
- 上述命令还激活了 virtualenv,因此 manage.py 命令可以 运行 具有所有正确的依赖项。调整你的 virtualenv 的路径。
- 最后,您需要确保激活了正确的 Django 设置,方法是设置 DJANGO_SETTINGS_MODULE 环境变量(您可以在 .bashrc 中执行此操作,因此
source
更早)或将 --settings path.to.settings
选项传递给 manage.py
.
- 最后一部分是将任务的输出定向到日志文件,这样您就可以在出现问题时进行故障排除。还请在末尾添加
2>&1
,以便 cron 错误 (stderr) 也被定向到同一日志。
要检查您的 crontab,运行 crontab -l
(对于当前登录的用户)或 crontab -l -u user
对于不同的用户。
我目前正在使用 HDFS、Apache Livy 和 Django,其目的是发送请求以获取存储在 HDFS 中并调用 Livy 来创建批处理的一些代码 运行。现在,一切正常,我有一个基本的 wordcount 存储在 HDFS 中,带有一个 .txt 文件,在一个 html 页面上,我只有一个简单的按钮可以单击以启动整个过程。
我成功创建了字数统计结果,我的下一步是从 Livy 获取信息,例如当前会话(或批次)的 ID starting/running/dead/success 某种回调,但我需要它自我实现,这样我就可以知道每个会话处于什么状态。为此,我想我可以使用 Django-cron,因此我无法正确设置它。我没有错误,但没有更多的事情发生。我错过了什么?
目前在 Centos7 上工作,但我在 Python 3.6 中使用 Conda 环境,Django 最新版本,livy 和 HDFS(最新版本)也是如此
这是我当前的文件:
livy.html
{% load static %}
<html>
<body>
<div id="div1">
{{result.sessions}}
</div>
<form action="#" method="get">
<input type="text" name="mytextbox" />
<input type="submit" class="btn" value="Click" name="mybtn">
</form>
</body>
</html>
views.py
from django.shortcuts import render
from django.http import HttpResponse
from django_cron import CronJobBase, Schedule
import wordcount, livy
# Create your views here.
class CheckIdCronJob(CronJobBase):
RUN_EVERY_MINS = 1 # every minute
schedule = Schedule(run_every_mins=RUN_EVERY_MINS)
code = 'button.CheckIdCronJob' # a unique code
def index(request):
if(request.GET.get('mybtn')):
r = livy.send(request.GET.get('mytextbox')) #(/test/LICENSE.txt)
return render(request,'button/livy.html', {'result':r})
return render(request,'button/livy.html')
livy.py
import json, pprint, requests, textwrap
def send(inputText):
host = 'http://localhost:8998'
data = {"file":"/myapp/wordcount.py", "args":[inputText,"2"]}
headers = {'Content-Type': 'application/json'}
r = requests.post(host + '/batches', data=json.dumps(data), headers=headers)
r = requests.get(host + '/batches' + '', data=json.dumps(data), headers=headers)
return r.json()
django-crontab 所做的只是让编写 运行 作业的管理命令变得容易,并指定 often/when 这些作业应该如何 运行。您最终得到一个管理命令 ./manage.py runcron
,它将检查您的所有作业,并在需要时 运行 检查它们。
它不做的是连续 runcron
,如果您想确保在正确的时刻工作 运行,这正是您真正需要的。基本上,例如,您希望每分钟 runcron
到 运行(或者如果时间不是每 10 分钟那么关键),那么您仍然需要使用一些系统守护程序来执行此操作。
crontab
在 CentOS 上可用,可用于此目的。 django-crontab 的安装向您展示了如何创建一个每 5 分钟 运行 runcron
的 crontab 的示例:
crontab -e
*/5 * * * * source /home/ubuntu/.bashrc && source /home/ubuntu/work/your-project/bin/activate && python /home/ubuntu/work/your-project/src/manage.py runcrons > /home/ubuntu/cronjob.log
您必须调整它以适合您的用例:
如果您只执行
crontab -e ...
作业将 运行 作为您当前登录的用户。该用户可能不是 运行manage.py
命令的正确用户,因为该用户需要对 运行 您的项目具有正确的权限。使用-u user
为不同的用户制作 crontab。在生产环境中 运行 这实际上是一件复杂的事情:获得正确的用户权限并让正确的用户 运行 执行各种任务。通常你会有一个
www-data
或apache
用户运行你的服务器(因此django应用程序)并且你希望同一个用户运行manage.py
命令。它不应该是root
运行ning apache,因为这会带来安全风险(您的网络服务器将拥有对整个系统的完全访问权限)。- 以上命令来源 .bashrc 以确保环境变量设置正确。 /home/ubuntu/ 只是用户
ubuntu
的用户主目录。适当地改变它。 - 上述命令还激活了 virtualenv,因此 manage.py 命令可以 运行 具有所有正确的依赖项。调整你的 virtualenv 的路径。
- 最后,您需要确保激活了正确的 Django 设置,方法是设置 DJANGO_SETTINGS_MODULE 环境变量(您可以在 .bashrc 中执行此操作,因此
source
更早)或将--settings path.to.settings
选项传递给manage.py
. - 最后一部分是将任务的输出定向到日志文件,这样您就可以在出现问题时进行故障排除。还请在末尾添加
2>&1
,以便 cron 错误 (stderr) 也被定向到同一日志。
要检查您的 crontab,运行 crontab -l
(对于当前登录的用户)或 crontab -l -u user
对于不同的用户。