Ich suche nach einer Bibliothek in Python, die Funktionen bietet at
und cron
mag.
Ich hätte gerne eine reine Python-Lösung, anstatt mich auf Tools zu verlassen, die auf der Box installiert sind. Auf diese Weise laufe ich auf Maschinen ohne Cron.
Für diejenigen, die nicht vertraut sind mit cron
: Sie können Aufgaben basierend auf einem Ausdruck planen wie:
0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.
Die Cron-Time-Ausdruckssyntax ist weniger wichtig, aber ich hätte gerne etwas mit dieser Art von Flexibilität.
Wenn es nichts gibt, das dies für mich sofort erledigt, werden Vorschläge für die Bausteine, um so etwas zu machen, dankbar entgegengenommen.
Bearbeiten Ich bin nicht daran interessiert, Prozesse zu starten, sondern nur "Jobs", die auch in Python-Python-Funktionen geschrieben sind. Notwendigerweise denke ich, dass dies ein anderer Thread wäre, aber nicht in einem anderen Prozess.
Zu diesem Zweck suche ich nach der Ausdruckskraft des Cron-Zeitausdrucks, aber in Python.
Cron gibt es schon seit Jahren, aber ich versuche so portabel wie möglich zu sein. Ich kann mich nicht auf seine Anwesenheit verlassen.
quelle
Antworten:
Wenn Sie nach einem leichten Checkout- Zeitplan suchen :
Offenlegung : Ich bin der Autor dieser Bibliothek.
quelle
schedule
. Es hat gut für mich funktioniert. Es wäre noch schöner, wenn es eine Cron-ähnliche Syntax und unterstützte Dekoratoren hätte (siehe Crython, aber benutze diese Bibliothek nicht, weil sie nicht funktioniert; die Planung scheint nicht gut geschrieben zu sein).do()
Funktion leitet zusätzliche Argumente, die Sie an sie übergeben, an die Jobfunktion weiter : Schedule.readthedocs.io/en/stable/api.html#schedule.Job.do Sie können dies beispielsweise tun :schedule.every().hour.do(job, param1, param2)
Kein Lambda erforderlich. Hoffe das hilft :)Sie können einfach die normale Syntax zur Übergabe von Python-Argumenten verwenden, um Ihre crontab anzugeben. Angenommen, wir definieren eine Ereignisklasse wie folgt:
(Hinweis: Nicht gründlich getestet)
Dann kann Ihr CronTab in der normalen Python-Syntax wie folgt angegeben werden:
Auf diese Weise erhalten Sie die volle Leistungsfähigkeit der Argumentationsmechanik von Python (Mischen von Positions- und Schlüsselwortargumenten und Verwenden symbolischer Namen für Namen von Wochen und Monaten).
Die CronTab-Klasse wird so definiert, dass sie einfach in Minutenschritten schläft und bei jedem Ereignis check () aufruft. (Es gibt wahrscheinlich einige Feinheiten mit Sommerzeit / Zeitzonen, auf die Sie achten sollten). Hier ist eine schnelle Implementierung:
Ein paar Dinge, die zu beachten sind: Pythons Wochentage / Monate sind (im Gegensatz zu cron) mit Null indiziert, und dieser Bereich schließt das letzte Element aus, daher wird Syntax wie "1-5" zu Bereich (0,5) - dh [0,1,2, 3,4]. Wenn Sie die Cron-Syntax bevorzugen, sollte das Parsen jedoch nicht zu schwierig sein.
quelle
pip install anything
:)Vielleicht ist dies erst aufgetaucht, nachdem die Frage gestellt wurde. Ich dachte, ich erwähne es nur der Vollständigkeit halber: https://apscheduler.readthedocs.org/en/latest/
quelle
Eine Sache, die ich bei meinen Suchen gesehen habe, ist das Python-
sched
Modul, nach dem Sie vielleicht suchen.quelle
"... Crontab-Modul zum Lesen und Schreiben von Crontab-Dateien und zum automatischen und einfachen Zugriff auf das System cron über eine direkte API. ..."
http://pypi.python.org/pypi/python-crontab
und auch APScheduler, ein Python-Paket. Bereits geschrieben und debuggt.
http://packages.python.org/APScheduler/cronschedule.html
quelle
Mehr oder weniger wie oben, aber gleichzeitig mit gevent :)
quelle
Keine der aufgelisteten Lösungen versucht, eine komplexe Cron-Zeitplanzeichenfolge zu analysieren. Also, hier ist meine Version mit Croniter . Grundlegendes:
Hilfsroutinen:
quelle
elif
? Atm Ich verwende einen Zeitplan wie das"* * * * *"
Hinzufügen vontime.sleep
mehr als 1 Minute in der "Do your periodic thing"if
, aber ich sehe immer das Zeug in dieser if-Anweisung. Wenn es länger als 1 Minute dauert, sehe ich nur, wie die while-Schleife diese fehlende Schleifenausführung überspringt.Ich habe das Skript geändert.
Einfach zu verwenden:
Versuchen Sie, die Aufgabe in der ersten Sekunde einer Minute zu starten.
Code auf Github
quelle
Ich habe eine kleinere Korrektur für die von Brian vorgeschlagene CronTab-Klassenlaufmethode .
Das Timing war um eine Sekunde verschoben, was am Ende jeder Minute zu einer 1-Sekunden-Schleife führte.
quelle
Es gibt keine "reine Python" -Methode, da ein anderer Prozess Python starten müsste, um Ihre Lösung auszuführen. Jede Plattform bietet eine oder zwanzig verschiedene Möglichkeiten, um Prozesse zu starten und ihren Fortschritt zu überwachen. Auf Unix-Plattformen ist cron der alte Standard. Unter Mac OS X gibt es auch launchd, das das Cron-ähnliche Starten mit Watchdog-Funktionen kombiniert, die Ihren Prozess am Leben erhalten, wenn Sie dies wünschen. Sobald Python ausgeführt wird, können Sie das Planungsmodul verwenden, um Aufgaben zu planen.
quelle
Ich weiß, dass es viele Antworten gibt, aber eine andere Lösung könnte darin bestehen Dekorateuren zusammenzuarbeiten . Dies ist ein Beispiel, um eine Funktion jeden Tag zu einer bestimmten Zeit zu wiederholen. Der coole Gedanke bei dieser Verwendung ist, dass Sie nur den Syntaktischen Zucker zu der Funktion hinzufügen müssen , die Sie planen möchten:
Und der Dekorateur wird aussehen wie:
quelle
Brians Lösung funktioniert ganz gut. Wie andere bereits betont haben, gibt es jedoch einen subtilen Fehler im Ausführungscode. Ich fand es auch zu kompliziert für die Bedürfnisse.
Hier ist meine einfachere und funktionalere Alternative für den Ausführungscode, falls jemand ihn benötigt:
quelle
Eine andere triviale Lösung wäre:
Und die Klasse aqcron.At ist:
quelle
Wenn Sie nach einem verteilten Planer suchen, können Sie https://github.com/sherinkurian/mani besuchen. Er muss jedoch überarbeitet werden und ist möglicherweise nicht das, wonach Sie suchen. (Beachten Sie, dass ich der Autor bin) Dies wurde erstellt, um Fehlertoleranz zu gewährleisten, indem die Uhr auf mehr als einem Knoten ausgeführt wird.
quelle
Ich weiß nicht, ob so etwas schon existiert. Es wäre einfach, eigene Zeit-, Datums- und / oder Kalendermodule zu schreiben, siehe http://docs.python.org/library/time.html
Die einzige Sorge für eine Python - Lösung ist , dass Ihre Arbeit Bedürfnisse immer zu laufen und möglicherweise automatisch „wiederbelebt“ werden nach einem Neustart, etwas , für das Sie tun müssen auf systemabhängige Lösungen angewiesen.
quelle
Sie können sich PiClouds [1] Crons [2] ansehen, beachten Sie jedoch, dass Ihre Jobs nicht auf Ihrem eigenen Computer ausgeführt werden. Es ist auch ein Service, für den Sie bezahlen müssen, wenn Sie mehr als 20 Stunden Rechenzeit pro Monat verwenden.
[1] http://www.picloud.com
[2] http://docs.picloud.com/cron.html
quelle
Methode von Crontab auf dem Server.
Python-Dateiname hello.py
Schritt 1: Erstellen Sie eine sh-Datei mit dem Namen s.sh.
Schritt 2: Öffnen Sie den Crontab Editor
Schritt 3: Zeitplan hinzufügen
Verwenden Sie die Crontab-Formatierung
Dieser Cron läuft "In Minute 2".
quelle
Mir gefällt, wie das Pycron- Paket dieses Problem löst.
quelle