Cron-Job, der einen Django Python-Befehl über eine virtuelle Umgebung ausführt, funktioniert nicht

7

Ich habe eine Crontab-Datei, die angeblich einen Django-Befehl nach dem Laden der virtuellen Projektumgebung ausführt:

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

... aber es macht absolut nichts. Das Cron-Protokoll gibt kein besonderes Problem aus:

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)

Es ist unnötig zu erwähnen, dass der Befehl selbst beim Kopieren in die Shell einwandfrei funktioniert.

Ich weiß, dass es mit den Umgebungsvariablen meiner Crontab zusammenhängt, aber ich bin in dieser Angelegenheit sehr ungebildet, und ich habe keine Ahnung, was ich tun soll, insbesondere wenn es unter einer virtuellen Python-Umgebung ausgeführt wird. Sollte es meine Benutzerumgebungsvariablen verwenden? Die aus der virtuellen Umgebung? Wie kann man das umsetzen? Vielen Dank!

NB: Falls es hilft, habe ich die folgende Ausgabe meiner crontab-Umgebungsvariablen (beim Exportieren von "env" in eine Datei über die 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

Und die folgenden Umgebungsvariablen unter der virtuellen Projektumgebung:

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
Bolino
quelle
1
@ AndrewSchulman Diese Situation wird in dieser Frage überhaupt nicht behandelt. Ein etwas peinliches Versehen.
Michael Hampton

Antworten:

8

Es gibt verschiedene Möglichkeiten, dies zu lösen:

Erstens funktioniert es nicht, weil /bin/shdas Shell-Cron Befehle ausführt, aber /bin/shnicht unterstützt source. Die schnelle Lösung besteht also darin, SHELL=/bin/bashdie Crontab einzustellen .

Oder...

Zweitens ist es source virtualenv/bin/activatesowieso nicht notwendig . Sie können die virtuelle Python einfach direkt aufrufen.

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

Diese wurden dieser Frage zu SO entnommen , deren Antworten möglicherweise andere Ideen für Menschen unter ähnlichen, aber nicht ganz den gleichen Umständen enthalten.

Michael Hampton
quelle
Vielen Dank, ich habe beide Lösungen ausprobiert und beide funktionieren! Es war also kein Problem, das genau mit Umgebungsvariablen zusammenhängt.
Bolino