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

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

Ich habe eine Crontab-Datei, die angeblich einen Django-Befehl ausführt, nachdem die virtuelle Projektumgebung geladen wurde:

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

...aber es passiert 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 perfekt funktioniert, wenn er in der Shell kopiert und eingefügt wird.

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

NB: Falls es hilft, ich habe 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

Antwort1

Es gibt mehrere Möglichkeiten, dieses Problem zu lösen:

Erstens funktioniert es nicht, weil /bin/shes die Shell ist, die cron zum Ausführen von Befehlen verwendet, aber /bin/shnicht unterstützt . Die schnelle Lösung besteht also darin , in der Crontab sourcefestzulegen .SHELL=/bin/bash

Oder...

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

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

Diese stammen ausdiese Frage auf SO, deren Antworten möglicherweise weitere Ideen für Personen in ähnlichen, aber nicht ganz gleichen Umständen enthalten.

verwandte Informationen