J'essaie d'exécuter une commande de gestion Django à partir de cron. J'utilise virtualenv pour garder mon projet en sandbox.
J'ai vu des exemples ici et ailleurs qui montrent l'exécution de commandes de gestion à partir de virtualenv comme:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Cependant, même si syslog affiche une entrée au moment où la tâche aurait dû démarrer, cette tâche ne s'exécute jamais réellement (le fichier journal du script est vide). Si j'exécute la ligne manuellement depuis le shell, cela fonctionne comme prévu.
La seule façon dont je peux actuellement exécuter la commande via cron, est de décomposer les commandes et de les placer dans un script wrapper dumb bash:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
ÉDITER:
ars a trouvé une combinaison fonctionnelle de commandes:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Au moins dans mon cas, l'invocation du script d'activation pour le virtualenv n'a rien fait. Cela fonctionne, ainsi de suite avec le spectacle.
la source
env
etexport
tous dans un wrapper de script bash que vous appelez à partir de la crontab.Réponses:
Vous devriez pouvoir le faire en utilisant le
python
dans votre environnement virtuel:EDIT: Si votre projet django n'est pas dans le PYTHONPATH, alors vous devrez basculer vers le bon répertoire:
Vous pouvez également essayer de consigner l'échec depuis cron:
Une autre chose à essayer est de faire le même changement dans votre
manage.py
script tout en haut:la source
~
le chemin complet? (Vous l'avez probablement fait, juste pour vous assurer ...)L'exécution à
source
partir d'un fichier cron ne fonctionnera pas comme Cron l'utilise/bin/sh
comme shell par défaut, qui ne prend pas en chargesource
. Vous devez définir la variable d'environnement SHELL sur/bin/bash
:Il est difficile de comprendre pourquoi cela échoue, car il
/var/log/syslog
n'enregistre pas les détails de l'erreur. Il est préférable de vous alias pour rooter afin de recevoir par e-mail toutes les erreurs cron. Ajoutez-vous simplement/etc/aliases
et courezsendmail -bi
.Plus d'informations ici: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
le lien ci-dessus est changé en: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
la source
. /path/to/virtualenv/bin/activate
postactivate
fichier, vous devriez le fairesource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
Ne cherchez plus:
Approche générique:
La beauté de ceci est que vous n'avez PAS besoin de changer la
SHELL
variable pour crontab desh
enbash
la source
La seule façon correcte d'exécuter des tâches cron python lors de l'utilisation d'un virtualenv est d'activer l'environnement, puis d'exécuter le python de l'environnement pour exécuter votre code.
Une façon de faire est d'utiliser virtualenv
activate_this
dans votre script python, voir: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonUne autre solution fait écho à la commande complète, y compris l'activation de l'environnement et son acheminement
/bin/bash
. Considérez ceci pour votre/etc/crontab
:la source
Plutôt que de fouiner avec des shebangs spécifiques à virtualenv, ajoutez simplement
PATH
la crontab.À partir d'un virtualenv activé, exécutez ces trois commandes et les scripts python devraient simplement fonctionner:
La première ligne du crontab devrait maintenant ressembler à ceci:
la source
La meilleure solution pour moi était à la fois
man python
mentionne la modification du chemin dans shell à$PYTHONPATH
ou en python avecsys.path
D'autres réponses mentionnent des idées pour ce faire en utilisant le shell. Depuis python, l'ajout des lignes suivantes à mon script me permet de l'exécuter avec succès directement à partir de cron.
Voici à quoi cela ressemble dans une session interactive -
la source
Je voudrais ajouter ceci parce que j'ai passé un certain temps à résoudre le problème et je n'ai pas trouvé de réponse ici pour la combinaison d'utilisation des variables dans cron et virtualenv. Alors peut-être que ça va aider quelqu'un.
Cela ne fonctionnait pas bien quand il était configuré comme
Merci @davidwinterbottom , @ reed-sandberg et @mkb pour avoir donné la bonne direction. La réponse acceptée fonctionne correctement jusqu'à ce que votre python ait besoin d'exécuter un script qui doit exécuter un autre binaire python à partir du répertoire venv / bin.
la source
C'est une solution qui a bien fonctionné pour moi.
J'utilise miniconda avec la version 4.7.12 de Conda sur un Ubuntu 18.04.3 LTS.
Je suis capable de placer ce qui précède dans un script et de l'exécuter via crontab également sans aucun problème.
la source
la source