2016-03-22 5 views
1

Ich versuche, einen benutzerdefinierten Verwaltungsbefehl auf meiner Django-App, in einer virtuellen Umgebung installiert.Automatisieren benutzerdefinierte Django-Management-Befehl mit crontab, innerhalb von virtualenv

Diese Aufgabe soll einmal pro Minute ausgeführt werden, und ich kann nicht ganz herausfinden, warum es nicht funktioniert.

Hier ist, was ich in meiner crontab:

*/1 * * * * /home/myuser/.virtualenvs/myvirtualenv/bin/python /home/myuser/myapp/manage.py mycommand --settings=myapp.settings 

Das wird nicht funktionieren, auch wenn ich der Befehl siehe Ausführung einmal pro Minute in /var/log/syslog, aber es muss versagt werden, weil es keine Wirkung erzeugt.

Wenn ich nur den gleichen Befehl kopieren und ausführen, wird alles glatt.

Ich habe dann versucht stattdessen einen externen Bash-Skript ausgeführt wird, was wiederum funktioniert perfekt, wenn ich es manuell ausführen:

*/1 * * * * source /home/myuser/myapp/myscript 

Das Skript das virtualenv aktiviert und betreibt den Management-Befehl. Auch hier keine Ergebnisse.

Ich bin ein bisschen verloren, da ich mich gründlich umgesehen habe und mich komplett festgefahren habe, da anscheinend nirgends Fehlermeldungen auftauchen.

+1

empfehlen Welche Protokollierung tun Ihr Management-Befehl geht? Es würde sich lohnen, so viel wie möglich festzuhalten, um zu sehen, wo es explodiert, sonst testeest du effektiv blind. –

+0

Auch in welcher Umgebung läuft das? VPS/Shared Hosting? –

+0

Mein Befehl macht einen guten Teil der Protokollierung, aber ich kann nichts davon sehen, wenn ich den Befehl nicht manuell ausführe. Das führt mich zu der Annahme, dass ich etwas mit Cron und nicht mit dem Befehl vermasselt habe. Es läuft auf einem VPS ja. – spookyjudges

Antwort

1

Das Problem könnte sein, dass myapp.settings nicht auf Ihrem Python-Pfad ist. Ich würde versuchen, Verzeichnis wechseln zuerst:

*/1 * * * * cd /home/mysuser/myapp && /home/myuser/.virtualenvs/myvirtualenv/bin/python manage.py mycommand --settings=myapp.settings 
+0

Nein, das hat nicht geholfen. – spookyjudges

+0

Leiten Sie stdout und stderr in eine Datei um, z. Hängen Sie ''/pfad/an/logfile 2> & 1' an den Befehl an. Dann sehen Sie möglicherweise, was das Problem in der Protokolldatei ist. – Alasdair

0

mit crontabs mich in einem meiner Projekte Nachdem das Hantieren, begann ich Celery (genauer gesagt Sellerie Schlag) zu verwenden, um meine periodische Aufgaben. Es ist nur ein wenig komplizierter einzurichten (Sie benötigen einen Nachrichten-Broker, z. B. Redis), aber es ist danach viel leistungsfähiger.

Auch wenn Sie die Ausführung der asynchronen Task nicht verwenden, ist die einfache Verwaltung von Cron-Jobs das Setup wert. Jobs können einfach direkt in Ihrem Projektcode definiert werden, indem Sie einen Funktionsdecorator verwenden, ohne dass Sie die Crontab auf dem Server bearbeiten müssen.

Für den Sellerie Arbeiter Verwaltung (en) und den Sellerie Beat Prozess, würde ich die Verwendung von supervisord

+0

Ich fürchte, ich muss auch so gehen. Ich habe ungefähr 2 Tage damit verbracht, diesen Befehl über cron laufen zu lassen, aber es scheint einfach nicht der richtige Weg zu sein. Sellerie auf der anderen Seite erschreckte mich, genau wegen der Gründe, die Sie erwähnten. – spookyjudges