Ein Cron-Ersatz, der mehrere Zeitzonen verarbeitet

8

Ich suche nach einem Cron-Ersatz (oder einer Methode in Cron, wenn überhaupt möglich), mit der Jobs in einer beliebigen Anzahl von Zeitzonen geplant werden können (insbesondere mehr als einer pro Benutzer / Datei). Was ich möchte, ist die Möglichkeit, eine Zeitzone pro Job (oder Cron-Linie) anzugeben und dann nur Zeiten in lokalen Zeitzonen anzugeben. Ich stelle fest, dass ich die gesamte Zeitzone ändern kann, in der cron ausgeführt wird, aber am Ende des Tages kann sie nur in einer Zeitzone ausgeführt werden.

Meine derzeitige Lösung besteht darin, alle meine Zeiten in GMT umzuwandeln und Jobs entsprechend auszuführen. Das einzige Problem besteht darin, dass während der Sommerwochen-Umstellungswochen viele manuelle Änderungen vorgenommen werden müssen, um sicherzustellen, dass die Dinge in der jeweiligen lokalen Zeitzone korrekt ausgeführt werden (z. B. einige) Regionen folgen nicht der Sommerzeit oder ändern sich nicht zum gleichen Zeitpunkt.

Irgendwelche Gedanken dazu?

mgray
quelle

Antworten:

3

Ich denke, du versuchst es in beide Richtungen und die Realität ist, dass du es einfach nicht kannst. Wenn Sie beispielsweise möchten, dass ein Job um 8 Uhr Ortszeit ausgeführt wird, unabhängig davon, ob die Sommerzeit aktiv ist, führen Sie Ihr System (und Cron) entweder in Ortszeit aus und führen keine saisonalen Änderungen durch oder Sie führen es in UTC aus ( nicht GMT) und nehmen saisonale Änderungen vor. Wenn Sie möchten, dass Ihre Jobs unabhängig davon zur gleichen UTC ausgeführt werden , führen Sie cron gemäß UTC aus, und es gibt nichts mehr zu tun.

Wenn das, was Sie wollen , ist für einen Benutzer in der Lage sein , einen cron - Job planen nach seiner lokalen Zeitzone und nicht über ihn zu Conversions denken für seine Bequemlichkeit dann Sie ein Conversion - Skript schreiben , die einen cron spec und eine Zeitzone übernimmt dann macht die Konvertierung zu UTC hinter den Kulissen und bearbeitet die Crontab für ihn. Es könnte sogar eine bidirektionale Konvertierung sein, um Änderungen an vorhandenen Einträgen zu verarbeiten.

Es ist hilfreich, wenn Sie uns mitteilen, was Sie tatsächlich erreichen möchten .

Bis auf weiteres angehalten.
quelle
6

fcron unterstützt diese Funktion.

Aus der Dokumentation der Option "Zeitzone" in fcrontab (5) :

Führen Sie den Job in der angegebenen Zeitzone aus. Zeitzonenname ist eine Zeichenfolge, die für die Umgebungsvariable TZ gültig ist. Weitere Informationen finden Sie in der Dokumentation Ihres Systems. Zum Beispiel ist "Europe / Paris" auf einem Linux-System gültig. Diese Option behandelt Änderungen der Sommerzeit korrekt. Die Umgebungsvariable TZ wird auf den Wert der Zeitzone festgelegt, wenn ein Job ausgeführt wird, der diese Option definiert.

Jroller
quelle
fcronscheint ziemlich alt zu sein und es hat keine Standardinstallation in ubuntu. Gibt es eine andere Lösung?
Silgon
Es scheint, dass fcron im Jahr 2011 aus Debian entfernt wurde, weil es "kaputt und veraltet" war :(
Peter Green
3

Sie könnten sich einen kleinen Wrapper schreiben, der drei Argumente enthält:

  • Zielzeitzonenstunde zu entsprechen
  • Zielzeitzone
  • Befehl zum Ausführen, wenn die Ziel-tz-Stunde mit der aktuellen Stunde übereinstimmt (in Ziel-tz).

Dann legen Sie einfach diese Wrapper-Linie in Ihre Crontab, um sie stündlich auszuführen:

python tz_wrapper.py 14 "US/Mountain" "echo 'hi'"

Einfache Python-Version:

#!/usr/bin/python
import sys, os, datetime
import pytz

arg_hour = sys.argv[1]
arg_timezone = sys.argv[2]
arg_cmd = sys.argv[3]

target_tz = pytz.timezone(arg_timezone)
target_hour = pytz.utc.localize(datetime.datetime.utcnow()).astimezone(target_tz).strftime("%H")

if target_hour == str(arg_hour):
    os.system(arg_cmd)
jasonjwwilliams
quelle
0

Ich empfehle die Verwendung der koordinierten Weltzeit (UTC), da diese nicht durch Sommerzeit beeinflusst wird. Siehe die Antworten zu "Winter- und Sommerzeitumschaltung ohne Unterbrechung der Zeitleiste". . Dies ist normalerweise auch für die Systemzeit am besten.

Kyle Brandt
quelle
Ich nehme an, ich habe meine Frage nicht klar genug gestellt ... Mein Problem ist, dass ich Jobs brauche, um um 8 Uhr Ortszeit in einer Region (z. B. Südafrika / Johannesburg) zu arbeiten. Wenn Sommerzeit auftritt, ändert sich der UTC-Versatz, um die neue Ortszeit zu berücksichtigen, und erfordert eine manuelle Bearbeitung, um dies zu berücksichtigen. Macht das Sinn oder fehlt mir hier etwas?
mgray
Sehen Sie, was Dennis gesagt hat, er hat Recht :-)
Kyle Brandt
0

Es gibt eine Portierung von Darwin für FreeBSD, die alles tut, was Sie wollen, wenn Sie auf FreeBSD sind.

https://github.com/freebsd/openlaunchd

Und es gibt jobd, das für * BSD und Linux ist.

https://github.com/mheily/jobd

lbutlr
quelle
1
Ist es möglich, den Teil der Konfiguration oder des Links zu teilen, in dem man sehen kann, wie die Zeitzone für einen bestimmten Job konfiguriert wird?
Silgon
-1

Cfengine ist die Art und Weise, wie wir das tun. Sie können Jobs mit Ortszeit (die sich an die Sommerzeit anpasst) oder GMT für gleichzeitige Jobs einrichten. Mit Ausnahmen können Sie jede Art von benutzerdefiniertem Kalender erstellen. Ich weiß, dass Sie eine Tonne Geld für die Planung von Software bezahlen können, aber wir brauchten nie mehr als dies, selbst mit Rechenzentren an drei Standorten auf der ganzen Welt.

SAnnukka
quelle