8 votes

La tâche Cron qui exécute une commande Django Python dans un environnement virtuel ne fonctionne pas.

J'ai un fichier crontab censé exécuter une commande Django après le chargement de l'environnement virtuel du projet :

*/1 * * * * source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand

...mais cela ne fait absolument rien. Le journal cron ne révèle aucun problème particulier :

Mar 13 19:51:01 110 CRON[23807]: (root) CMD (source /home/virtualenvs/mydjangoproject-venv/bin/activate && python /home/www/production/mydjangoproject/manage.py mydjangocommand)

Inutile de préciser que la commande elle-même fonctionne parfaitement lorsqu'elle est copiée-collée dans le Shell.

Je sais que c'est lié aux variables d'environnement de ma crontab, mais je suis très peu instruit en la matière, et je n'ai aucune idée de ce qu'il faut faire, en particulier lorsqu'il est exécuté sous un environnement virtuel Python. Doit-il utiliser les variables d'environnement de l'utilisateur ? Celles de l'environnement virtuel ? Comment mettre cela en œuvre ? Merci !

NB : Si cela peut aider, j'ai la sortie suivante des variables d'environnement de ma crontab (lorsque j'exporte "env" vers un fichier via la crontab) :

HOME=/root
LOGNAME=root
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
LC_ALL=en_US.UTF-8
PWD=/root

Et les variables d'environnement suivantes sous l'environnement virtuel du projet :

TERM=xterm-256color
SHELL=/bin/bash
SSH_CLIENT=x.x.x.x 53007 22
OLDPWD=/root/production/mydjangoproject
SSH_TTY=/dev/pts/0
LC_ALL=en_US.UTF-8
USER=root
VIRTUAL_ENV=/home/virtualenvs/mydjangoproject-venv
MAIL=/var/mail/root
PATH=/home/virtualenvs/mydjangoproject-
venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/root
LANG=en_US.UTF-8
PS1=(mydjangoproject-venv)${debian_chroot:+($debian_chroot)}\u@$(hostname -f):\w\$ 
SHLVL=1
HOME=/root
LS_OPTIONS=--color=auto --group-directories-first
LOGNAME=root
SSH_CONNECTION=x.x.x.x 53007 x.x.x.x 22
LC_CTYPE=en_US.UT

0 votes

1 votes

@AndrewSchulman Cette situation n'est pas du tout couverte par cette question. Un oubli quelque peu embarrassant.

8voto

Michael Hampton Points 232226

Il y a plusieurs façons de résoudre ce problème :

D'abord, ça ne marche pas parce que /bin/sh est le Shell que cron utilise pour exécuter des commandes, mais /bin/sh ne prend pas en charge source . Donc la solution rapide est de mettre SHELL=/bin/bash dans la crontab.

Ou...

Deuxièmement, il n'est pas nécessaire de source virtualenv/bin/activate de toute façon. Vous pouvez simplement appeler directement le Python de virtualenv.

* * * * * cd /home/www/production/mydjangoproject; /home/virtualenvs/mydjangoproject-venv/bin/python manage.py mydjangocommand

Elles ont été prises dans cette question sur le SO Les réponses à ces questions peuvent contenir d'autres idées pour les personnes se trouvant dans des circonstances similaires mais pas tout à fait identiques.

0 votes

Merci beaucoup, j'ai essayé vos deux solutions, et elles fonctionnent toutes les deux ! Il ne s'agissait donc pas d'un problème lié aux variables d'environnement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X