2010-08-09 5 views
2

J'ai un script python qui se connecte à un hôte externe, récupère des données et remplit une base de données Django avec les données. Le script python qui renseigne la base de données utilise ces lignes pour configurer l'environnement de django:Exécution d'un script python pour django via cron

path = os.path.normpath(os.path.join(os.getcwd(), '..')) 
sys.path.append(path) 
from django.core.management import setup_environ 
import settings 
setup_environ(settings) 

J'ai un script shell qui exécute en fait le script python:

export PYTHONPATH=$PYTHONPATH:/home/django/project_dir/ 
cd ~/project_dir/scripts/ 
~/virtualenv/bin/python my_script.py 

Et puis ma config Cron, qui est placé dans /etc/cron.d/

0 1 * * * django ~/project_dir/scripts/my_script.sh > /var/log/django_cron.log 

Notez que le projet de django a son propre utilisateur et environnement virtuel.

Le script shell s'exécute correctement lorsque je suis connecté en tant qu'utilisateur django. Mais le cron ne va pas courir! Je n'obtiens aucune erreur dans le fichier journal. Je suis sûr que c'est quelque chose de très simple, mais je ne le vois tout simplement pas ...

+0

Quelque chose ne montrant dans/var/log/cron'? –

+0

Y a-t-il une raison pour ne pas utiliser une commande de gestion? –

+0

Je reçois des entrées dans le journal cron que le cronjob a été exécuté à l'heure spécifiée, donc pas de problème. –

Répondre

2

Le problème était en fait que j'ai une variable d'environnement pour dire django si elle est en cours d'exécution dans le développement ou la production. Crontab n'exécute pas le fichier .bashrc où exporter cette variable de sorte que devait être ajouté à mon script shell:

export FLAVOR=live 
export PYTHONPATH=$PYTHONPATH:/home/django/project_dir/ 
cd ~/project_dir/scripts/ 
~/virtualenv/bin/python my_script.py 
0

Deux choses me viennent à l'esprit. Je ne pense pas que cron fera la substitution de tilde que vous attendez - peut-être que je me trompe, mais essayez de spécifier le chemin complet (c'est-à-dire/home/myuser/project_dir/...) dans votre entrée cron ainsi que vos scripts.

De plus, quel est le "django" dans votre entrée cron? Est-ce le nom de votre script ou est-ce une faute de frappe? Enfin, pour consigner les erreurs possibles de l'exécution de votre script, essayez:

0 1 * * * /home/myuser/project/script.sh > /var/log/django_cron.log 2>&1 
+0

django est l'utilisateur –

+0

En fait, maintenant j'ai changé la configuration donc je fais 'crontab -e' en tant qu'utilisateur django, et inclu la ligne que vous avez démontrée. C'est probablement le bon moyen de le faire. –

Questions connexes