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
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, dies zu lösen:
Erstens funktioniert es nicht, weil
/bin/sh
das Shell-Cron Befehle ausführt, aber/bin/sh
nicht unterstütztsource
. Die schnelle Lösung besteht also darin,SHELL=/bin/bash
die Crontab einzustellen .Oder...
Zweitens ist es
source virtualenv/bin/activate
sowieso nicht notwendig . Sie können die virtuelle Python einfach direkt aufrufen.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.
quelle