Cron und virtualenv
Ich versuche zu laufen eine Django-management-Befehl von cron. Ich bin mit virtualenv zu halten mein Projekt in der Sandbox.
Ich habe schon Beispiele gesehen, hier und anderswo, die zeigen, dass laufen-management-Befehle innerhalb von virtualenv ist wie:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Jedoch, obwohl syslog zeigt einen Eintrag, wenn Sie die Aufgabe haben sollte, begann, diese Aufgabe eigentlich nie läuft (in der log-Datei für das Skript ist leer). Wenn ich die Zeile manuell von der shell aus, funktioniert es wie erwartet.
Nur so kann ich derzeit bekommen Sie den Befehl zum ausführen über cron, zu brechen, die Befehle auf und legen Sie in eine dumme bash-wrapper-Skript:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
EDIT:
ars kam mit einer Kombination der Befehle:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Zumindest in meinem Fall, den Aufruf der activate-Skript für die virtualenv nichts getan. Das funktioniert, also weiter mit der show.
env
und export
Sie alle in einer bash-Skript-wrapper, die Sie nennen, aus der crontab. InformationsquelleAutor der Frage John-Scott | 2010-07-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in der Lage, dies zu tun durch die Verwendung der
python
in Ihrer virtuellen Umgebung:EDIT: Wenn Ihr django-Projekt, nicht im PYTHONPATH, dann werden Sie wechseln müssen, um das richtige Verzeichnis:
Können Sie auch versuchen, sich die Fehler von cron:
Eine andere Sache zu versuchen ist, um die gleiche Veränderung in Ihrem
manage.py
Skript ganz oben:InformationsquelleAutor der Antwort ars
Läuft
source
aus einem cronfile wird nicht funktionieren, da cron verwendet/bin/sh
als seine default-shell, die das nicht unterstützensource
. Sie müssen die SHELL-Umgebungsvariable zu/bin/bash
:Ist es schwierig zu erkennen, warum dieser nicht
/var/log/syslog
nicht log die Fehler-details. Am besten alias sich selbst zu root, so dass Sie per E-Mail erhalten mit jedem cron-Fehler. Fügen Sie einfach sich selbst zu/etc/aliases
und führensendmail -bi
.Weitere Infos hier:
http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
InformationsquelleAutor der Antwort DavidWinterbottom
Statt mucking um mit virtualenv-spezifische shebangs, Schreibe einfach
PATH
auf die crontab.Aus einer virtualenv aktiviert, führen diese drei Befehle und python-Skripten zu arbeiten, nur:
Die crontab ist die erste Zeile sollte jetzt wie folgt Aussehen:
InformationsquelleAutor der Antwort joemaller
Der einzig richtige Weg zu laufen, python cron-jobs bei der Verwendung einer virtualenv aktivieren Sie die Umwelt und führen in der Umgebung der python zum ausführen des Codes.
Einen Weg, dies zu tun ist die Verwendung virtualenv ist
activate_this
in Ihrem python-Skript, siehe: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonEine andere Lösung ist die Wiedergabe des vollständigen Befehls, einschließlich der Aktivierung des Umwelt-und Rohrleitungen in
/bin/bash
. Betrachten Sie diese für Ihre/etc/crontab
:InformationsquelleAutor der Antwort Ivanhoe
Für mich die beste Lösung war es, sowohl
enthalten die venv-Module-Verzeichnis.
man python
erwähnt ändern Sie den Pfad in der Schale an$PYTHONPATH
oder in python mitsys.path
Anderen Antworten erwähnt Ideen für die dies in der shell verwenden. Von python, hinzufügen der folgenden Zeilen in mein script ermöglicht es mir, um erfolgreich führen Sie es direkt aus cron.
Hier ist, wie es aussieht in einer interaktiven session --
InformationsquelleAutor der Antwort here