django crontab工作不起作用

时间:2016-11-22 08:08:40

标签: python linux django crontab

我有一个非常简单的django项目,它包含一个名为Quote的应用程序模型。

应用程序只有一个cron作业,每1分钟执行一次,从DB获取一个随机引用,并使用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)

不幸的是情况是一样的。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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?),这将让你进一步调试。