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/sh
es die Shell ist, die cron zum Ausführen von Befehlen verwendet, aber /bin/sh
nicht unterstützt . Die schnelle Lösung besteht also darin , in der Crontab source
festzulegen .SHELL=/bin/bash
Oder...
Zweitens ist es source virtualenv/bin/activate
auch 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.