2016-11-22 71 views
0

我有一个非常简单的django项目,其中包含一个名为Quote的应用程序模型。django crontab作业不起作用

该应用程序只需执行一个cron作业,每1分钟执行一次以从数据库中获取一个随机引号,并使用notify-send命令显示该报价的通知。

我正在使用django-crontab来实现此目标。

的cron.py是如下

from random import randint 
from models import Quote 
import subprocess, time, os 

def notify(): 
    latestQuote = Quote.objects.all().order_by("-id")[0] 
    max_id = latestQuote.id 
    quote = Quote.objects.get(pk=randint(1,max_id)) 
    subprocess.Popen(['notify-send',quote.quote]) 
    time.sleep(1) 

节目很简单,这里是设置模块中的cron设置

CRONJOBS = [('*/1 * * * *', 'core.cron.notify')] 

当执行./manage crontab add,一个cron命令添加到我的crontab如下

*/1 * * * * /usr/bin/python /home/anas/storage/motinder/manage.py crontab run 5ade4dc167538a33802640eeb92219ad # django-cronjobs for motinder 

如果我从系统crontab执行命令,通知显示成功,但cron作业不会自动执行。

编辑

我改变了代码在cron.py文件发送一个静态的通知,而不是让来自DB的报价。下面的查询

from random import randint 
from models import Quote 
import subprocess, time, os 

def notify(): 
    #latestQuote = Quote.objects.all().order_by("-id")[0] 
    #max_id = latestQuote.id 
    #quote = Quote.objects.get(pk=randint(1,max_id)) 
    #subprocess.Popen(['notify-send',quote.quote]) 
    subprocess.Popen(['notify-send',"TEST"]) 
    time.sleep(1) 

不幸的是,情况是一样的。

+0

您确实不需要第三方应用程序来设置连接器,只需将notify.py配置为CLI并将其直接添加到crontab即可避免所有这些复杂情况http://stackoverflow.com/documentation/django/5848/django-from-the-line-line#t = 201611230712189521958 – e4c5

+0

欣赏你的评论@ e4c5,但我在这里指的是使用Django ORM来简化对数据库的查询。还有一点需要注意的是,我尝试了使用简单的python脚本的相同方法,除了执行'notify-send'命令之外什么也不做,但情况保持不变。 – Fanooos

+0

而这正是我的建议。没有所有这些焦点的焦点。 – e4c5

回答

0

您是否尝试在您的python脚本上使用正确的Shebang行,并使您的文件可执行文件为chmod +x

#!/usr/bin/env python 

from random import randint 
from models import Quote 
import subprocess, time, os 

def notify(): 
    latestQuote = Quote.objects.all().order_by("-id")[0] 
    max_id = latestQuote.id 
    quote = Quote.objects.get(pk=randint(1,max_id)) 
    subprocess.Popen(['notify-send',quote.quote]) 
    time.sleep(1) 
+0

该命令使用自定义命令'crontab'执行Django的manage.py脚本,并且manage.py文件已经包含您发布的行,并且默认情况下也是可执行的。 – Fanooos

+0

你的'/ var/log/syslog'中有CRON错误吗? – molivier

+0

nop, DEVPC-01 CRON [25401]:(anas)CMD(/ usr/bin/python/home/anas/storage/motinder/manage)出现在系统日志 'Nov 22 11:55:01 .py crontab运行5ade4dc167538a33802640eeb92219ad#&>/tmp/mycommand.log#django-cronjobs for motinder)' – Fanooos

0

'notify-send'在哪里? cron不能在与你的登录shell相同的环境中运行,所以python可能不知道在哪里找到它。

如果Popen()调用失败,您可以通过强制执行某些操作来帮助自己。目前,没有任何事情会发生,因为你没有捕获任何输出。

(此外,这是普遍不好不等待您的来电Popen完成,除非你有一个很好的理由。)

有在subprocess多种实用功能,以帮助。尝试这个代替:

def notify(): 
    subprocess.check_call(['notify-send',"TEST"]) 

这将阻塞,直到过程完成,并且如果失败提高将要打印到stderr异常,例如因为它找不到'notify-send',这应该去/var/log/cron(或可能在您的系统上为/var/log/syslog?),并且可以让您进一步调试。