J'ai un projet django très simple qui consiste en un modèle d'application appelé Quote. L'application a simplement un travail cron qui s'exécute toutes les 1 minute pour obtenir une citation aléatoire de la base de données et utiliser la commande notify-send pour afficher une notification avec cette citation. J'utilise django-crontab pour atteindre cet objectif.Le travail django crontab ne fonctionne pas
Le cron.py est très simple comme indiqué ci-dessous
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)
Et voici les paramètres Cron dans le module Paramètres
CRONJOBS = [('*/1 * * * *', 'core.cron.notify')]
Lors de l'exécution ./manage crontab add
, une commande Cron est ajouté à mon crontab comme suit
*/1 * * * * /usr/bin/python /home/anas/storage/motinder/manage.py crontab run 5ade4dc167538a33802640eeb92219ad # django-cronjobs for motinder
Si j'ai exécuté la commande à partir du système crontab, la notification est affichée avec succès MAIS le travail cron ne s'exécute pas automatiquement.
Modifier
J'ai changé le code dans le fichier cron.py pour envoyer une notification statique au lieu d'obtenir la citation de la DB. Vérifiez ci-dessous
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)
Malheureusement, la situation est la même.
Vous n'avez vraiment pas besoin d'applications tierces pour configurer un conjob, toutes ces complications peuvent être évitées en configurant simplement votre notify.py en tant que CLI et en l'ajoutant directement à crontab http://stackoverflow.com/documentation/django/5848/django-from-the-command-line # t = 201611230712189521958 – e4c5
appréciant votre commentaire @ e4c5 mais mon point ici est d'utiliser Django ORM pour faciliter l'interrogation sur la base de données.Une note de plus, j'ai essayé la même approche en utilisant un simple script python qui ne fait rien sauf exécuter la commande 'notify-send' mais la situation reste la même. – Fanooos
Et c'est exactement ce que je suggère aussi. sans tout ce hocus pocus de popen. – e4c5