Code jede Stunde ausführen [geschlossen]

8

Ich muss einen Webdienst erstellen, der stündlich ausgeführt wird. Es wird verwendet, um Daten in einer Datenbank zu überprüfen und einer Tabelle in derselben Datenbank Warnungen hinzuzufügen, wenn bestimmte Bedingungen erfüllt / nicht erfüllt sind. Was wir derzeit haben, ist:

Wir haben Endgeräte, die Python verwenden, um an einen virtuellen Server von Amazon Web Services (AWS) zu berichten. Der AWS-Server nimmt diese Informationen und speichert sie in einer MySQL-Datenbank. Der AWS-Server ist Linux mit Django und Apache. Ich muss in der Lage sein, jede Stunde Python-Code auszuführen, der die von den Endgeräten gespeicherten Daten überprüft. Wenn bestimmte Bedingungen nicht erfüllt sind, wird der alertsTabelle in der Datenbank ein Datensatz hinzugefügt .

Wir haben ursprünglich einen Vertrag über die Erstellung des oben genannten Setups abgeschlossen. Ich bin neu in Python, Django und Apache. Ich habe jedoch bereits einige Änderungen am Python-Code vorgenommen, der die Daten von den Endgeräten sendet und auch empfängt. Ich bin ein Programmierer, der in die Webprogrammierung einbricht.

Hat jemand Empfehlungen, wie ich das machen kann?

Verweilen
quelle
Verwenden Sie Quartz-Scheduler. Der folgende Link wird hilfreich sein. quartz-scheduler.org Tutorial quartz-scheduler.org/documentation/quartz-2.1.x/quick-start
Quartz scheint für Java konzipiert zu sein. Ich benutze überhaupt kein Java. Ich benutze Python / Django.
Verweilen Sie

Antworten:

31

Wie wäre es mit einem Cronjob , vorausgesetzt, Sie haben Shell-Zugriff?

Der cron- Daemon ist auf praktisch jedem UNIX-ähnlichen System vorhanden und plant die Ausführung von Befehlen basierend auf einer Beschreibung in einer Datei namens crontab .

Jede Zeile der Datei enthält eine Reihe von Feldern, die die Zeitpunkte angeben, zu denen ein Befehl ausgeführt werden soll.

Ihre Aufgabe kann entweder ein eigenständiges Programm sein, das die von Ihnen gewünschte Aufgabe ausführt, oder, wie eine andere Antwort andeutet, ein Aufruf eines HTTP-Clients wie wget , curl oder fetch, um auf eine Webressource zuzugreifen, die die Aktion ausführt.

Wenn Sie Beschränkungen für die Dauer der Anforderung einer Anforderung haben, müssen Sie die Aufgabe möglicherweise in ein Offline-Skript oder -Programm verschieben, das nicht in Ihrem Webframework / Server ausgeführt wird.

Lars Viklund
quelle
Cron war definitiv das, was ich letztendlich benutzt habe. Danke für die Antwort. Für diejenigen, die nicht mit Cron arbeiten möchten, aber die gleiche Funktionalität wünschen, habe ich zwei Onlinedienste gefunden, die Jobs wie Cron ausführen: SetCronJob und Cronless .
Verweilen Sie
17

Mit Django auf AWS würde ich mich mit Sellerie befassen .

Sellerie fügt asynchrone Aufgaben hinzu und enthält einen Planer. In AWS können Sie Sellerie so konfigurieren, dass der Amazon Simple Queue Service als Broker verwendet wird (siehe Sellerie mit Amazon SQS zum Stapelüberlauf und diesen Blog-Beitrag zu diesem Thema).

Sie richten einen regelmäßigen Zeitplan für Sellerie-Aufgaben ein und es wird eine konfigurierte Aufgabe gemäß diesem Zeitplan ausgeführt.

Der Vorteil ist, dass Sie das gesamte Setup verwenden können, um jede asynchrone Aufgabe auszuführen und schwere Aufgaben von Ihrem Webserver an die Sellerie-Mitarbeiter zu verlagern.

Die leichte Alternative besteht darin, einfach einen Crontab-Job einzurichten. Sie können sogar eine Route in Ihrer Django-Anwendung konfigurieren, die mit curloder aufgerufen werden soll wget:

* 5 * * * curl http://username:password@hostname/route_to_job
Martijn Pieters
quelle
1
+1 Eine viel raffiniertere Lösung als meine einfache cronAufgabe und spezifisch für die Implementierung des OP.
Msanford
7

Da auf Ihrer AWS-Instanz Linux ausgeführt wird, können Sie dies wahrscheinlich als cronJob ausführen .

Sie könnten den Cron-Ansatz von Drupal verwenden , bei dem im Fall von Django ein Controller erstellt wird, der auf eine URL reagiert und dann die gewünschte Aktion ausführt.

Anschließend konfigurieren Sie eine Cron-Task für curldie URL des Controllers und lösen Ihr Skript aus.

Dies hat den zusätzlichen Vorteil, dass es jederzeit einfach über eine URL aufgerufen werden kann: Möglicherweise möchte ein ungeduldiger Manager einen Bericht, der aus Daten der letzten 20 Minuten generiert wird.

msanford
quelle
3

Vielleicht möchten Sie sich APScheduler ansehen. Dies ist ein quarzartiger Scheduler (wenn auch nicht so umfangreich) für Python.

Dies kann eine weitaus bessere Alternative zu extern ausgeführten Cron-Skripten für Anwendungen mit langer Laufzeit (z. B. Webanwendungen) sein, da es plattformneutral ist und direkt auf die Variablen und Funktionen Ihrer Anwendung zugreifen kann.

Eine Beschreibung der neuesten Version finden Sie hier: http://pypi.python.org/pypi/APScheduler/2.0.3

Hier finden Sie einige Dokumentationen zur Installation / Implementierung: https://apscheduler.readthedocs.org/en/latest/

Hier sind einige der Funktionen:

  • Keine (harten) externen Abhängigkeiten
  • Thread-sichere API
  • Hervorragende Testabdeckung (getestet mit CPython 2.5 - 2.7, 3.3, Jython 2.5.3, PyPy 1.9)
  • Konfigurierbare Planungsmechanismen (Trigger):
    • Cron-ähnliche Planung
    • Verzögerte Planung von Einzelausführungsjobs (wie der UNIX-Befehl "at")
    • Intervallbasiert (einen Job in festgelegten Zeitintervallen ausführen)
  • Mehrere gleichzeitig aktive Jobspeicher:
    • RAM
    • Dateibasierte einfache Datenbank (Regal)
    • SQLAlchemy (alle unterstützten RDBMS funktionieren)
    • MongoDB
    • Redis
Anna
quelle
1

Ich denke, Sie können einige Sachen wie ein verwenden django-extensions

Django-Extensions Website

Es gibt ein Modul - Jobs. Für mich ist dies ein sehr gutes Werkzeug, um Ihre Cronjobs zu kontrollieren.

Die zweite Option ist die Verwendung eines Fabric und die Erstellung einer Funktion dafür.

Und ich sehe den dritten Weg. Verwenden Sie Ihre Fantasie und Ihr Wissen und erstellen Sie mit subprocess und sh eine eigene Funktion.

Demagog
quelle
1

Die wahrscheinlichste Antwort hier ist, dass Sie crontab mit der Standardeinstellung ausführen, was bedeutet, dass die crontab SPOOL RATHER THAN THE FILES angezeigt wird.

In der Zwischenzeit kann es auch in AWS ausgeführt werden, da cron vorinstalliert und konfiguriert ist. Dies ermöglicht die Einrichtung einer Aufgabe, die stündlich, täglich, wöchentlich oder monatlich sowie in jedem anderen Zeitraum ausgeführt werden soll, indem Dateien eingefügt werden ein /etc/cron.xxxxxxVerzeichnis wie hier erklärt .

Das Einrichten eines Jobs für stündliche, tägliche, wöchentliche oder monatliche Ausführung ist sehr schnell. Da die Frage lautet, wie Code jede Stunde ausgeführt werden soll , können Sie in AWS Linux eine Datei in erstellen /etc/cron.hourly.

Hier ist der Schritt, wenn Sie sich über den SSH-Client bei Ihrer Instanz anmelden.

$ echo "/usr/bin/python -q /path/to/your/file" > application
$ sudo mv application /etc/cron.hourly/
$ sudo chown -R root /etc/cron.hourly
$ sudo chmod 2755 /etc/cron.hourly/application
$ sudo /etc/init.d/crond restart

Im obigen Beispiel wurde die Datei gespeichert und als "Anwendung" bezeichnet. Der Name spielt keine Rolle, solange er einzigartig ist. Dies ist der Protokollbericht, indem Sie Folgendes ausführen:$ sudo vim /var/log/cron

Dec 28 19:01:01 ip-xxx-xx-xx-xx CROND[20243]: (root) CMD (run-parts /etc/cron.hourly)
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20261]: finished 0anacron
Dec 28 19:01:01 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20243]: starting application
Dec 28 19:01:02 ip-xxx-xx-xx-xx run-parts(/etc/cron.hourly)[20323]: finished application

Wie im Protokoll angezeigt, auf stündlicher Basis beginnen, um sie auszuführen Anacron dass führt periodische Befehlsplanung , die traditionell von getan wird cron , und dann alle anderen Dateien im Verzeichnis aufrufen und die Befehle in den einzelnen Dateien ausführen.

Chetabahana
quelle