Ich versuche, einen Django-Verwaltungsbefehl von cron aus auszuführen. Ich verwende virtualenv, um mein Projekt in einer Sandbox zu halten.
Ich habe hier und anderswo Beispiele gesehen, die das Ausführen von Verwaltungsbefehlen innerhalb von virtualenv zeigen, wie:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Obwohl syslog einen Eintrag anzeigt, wann die Aufgabe hätte gestartet werden sollen, wird diese Aufgabe nie ausgeführt (die Protokolldatei für das Skript ist leer). Wenn ich die Zeile manuell über die Shell ausführe, funktioniert sie wie erwartet.
Die einzige Möglichkeit, den Befehl derzeit über cron auszuführen, besteht darin, die Befehle aufzuteilen und in ein dummes Bash-Wrapper-Skript zu schreiben:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
BEARBEITEN:
ars hat eine funktionierende Kombination von Befehlen entwickelt:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Zumindest in meinem Fall hat das Aufrufen des Aktivierungsskripts für die virtuelle Umgebung nichts bewirkt. Das funktioniert so weiter mit der Show.
quelle
env
undexport
allen in einem Bash-Skript-Wrapper zu sichern, den Sie von der Crontab aus aufrufen.Antworten:
Sie sollten dazu in der Lage sein, indem Sie
python
in Ihrer virtuellen Umgebung Folgendes verwenden:BEARBEITEN: Wenn sich Ihr Django-Projekt nicht im PYTHONPATH befindet, müssen Sie in das richtige Verzeichnis wechseln:
Sie können auch versuchen, den Fehler von cron zu protokollieren:
Sie können auch versuchen, die gleiche Änderung in Ihrem
manage.py
Skript ganz oben vorzunehmen :quelle
~
den vollständigen Pfad ersetzt? (Sie haben es wahrscheinlich getan, nur um sicherzugehen ...)Das Ausführen
source
von einer Cronfile funktioniert nicht so, wie Cron es/bin/sh
als Standard-Shell verwendet, was nicht unterstützt wirdsource
. Sie müssen die Umgebungsvariable SHELL wie folgt festlegen/bin/bash
:Es ist schwierig zu erkennen, warum dies fehlschlägt, da
/var/log/syslog
die Fehlerdetails nicht protokolliert werden. Am besten aliasen Sie sich als root, damit Sie per E-Mail über Cron-Fehler informiert werden. Füge dich einfach hinzu/etc/aliases
und rennesendmail -bi
.Weitere Informationen hier: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
Der obige Link wird geändert in: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
quelle
. /path/to/virtualenv/bin/activate
postactivate
Datei haben, sollten Sie tunsource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
Suchen Sie nicht weiter:
Generischer Ansatz:
Die Schönheit über das , was Sie tun müssen , um die Änderung
SHELL
für crontab Variable aussh
zubash
quelle
Die einzig richtige Möglichkeit, Python-Cron-Jobs auszuführen, wenn Sie eine virtuelle Umgebung verwenden, besteht darin, die Umgebung zu aktivieren und dann die Python der Umgebung auszuführen, um Ihren Code auszuführen.
Eine Möglichkeit, dies zu tun, besteht darin, virtualenvs
activate_this
in Ihrem Python-Skript zu verwenden, siehe: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonEine andere Lösung besteht darin, den vollständigen Befehl zu wiederholen, einschließlich der Aktivierung und Weiterleitung der Umgebung
/bin/bash
. Betrachten Sie dies für Ihre/etc/crontab
:quelle
Anstatt mit virtualenv-spezifischen Shebangs herumzuspielen, stellen Sie sich einfach
PATH
auf die Crontab.Führen Sie auf einer aktivierten virtuellen Umgebung diese drei Befehle aus, und Python-Skripte sollten einfach funktionieren:
Die erste Zeile des Crontab sollte nun folgendermaßen aussehen:
quelle
Die beste Lösung für mich war für beide
man python
erwähnt das Ändern des Pfades in der Shell bei$PYTHONPATH
oder in Python mitsys.path
Andere Antworten erwähnen Ideen, um dies unter Verwendung der Shell zu tun. Wenn ich von Python aus die folgenden Zeilen zu meinem Skript hinzufüge, kann ich es erfolgreich direkt von cron aus ausführen.
So sieht es in einer interaktiven Sitzung aus:
quelle
Ich möchte dies hinzufügen, da ich einige Zeit damit verbracht habe, das Problem zu lösen, und hier keine Antwort für die Kombination der Verwendung von Variablen in cron und virtualenv gefunden habe. Vielleicht hilft es jemandem.
Es hat nicht gut funktioniert, als es wie konfiguriert wurde
Vielen Dank an @davidwinterbottom , @ reed-sandberg und @mkb für die richtige Richtung. Die akzeptierte Antwort funktioniert tatsächlich einwandfrei, bis Ihr Python ein Skript ausführen muss, das eine andere Python-Binärdatei aus dem Verzeichnis venv / bin ausführen muss.
quelle
Dies ist eine Lösung, die für mich gut funktioniert hat.
Ich verwende Miniconda mit Conda Version 4.7.12 auf einem Ubuntu 18.04.3 LTS.
Ich kann das Obige in ein Skript einfügen und es auch problemlos über crontab ausführen.
quelle
quelle