2016-11-22 70 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?),並且可以讓您進一步調試。