Geplante Jobs während der Herbstzeit ändern

12

Ich frage mich, wie andere mit diesem Szenario umgehen.

Was ist, wenn Sie einen Job haben, der um 1:30 Uhr ausgeführt werden soll? Im Herbst, wenn sich die Zeit ändert, wiederholt sich die Stunde von 1:00:00 bis 1:59:59, sodass der Job zweimal ausgeführt wird.

Dies kann Windows Task Scheduler, SQL Agent oder ein anderes Planungstool sein. Die meisten dieser Tools basieren anscheinend auf der Maschinenzeit und nicht auf der UTC-Zeit. Wenn ich anweisen würde, den Job jede Nacht um UTC-Zeit auszuführen, hätte ich kein Problem mit der doppelten Stunde.

NealWalters
quelle
1
Ich konnte nichts aktuelleres finden, aber hoffentlich
bringt
Das ist exzellent, warum nicht eine Antwort posten?
NealWalters
Nun, es gibt Ihnen nicht wirklich eine Lösung (zumindest nicht, dass ich sie nicht lesen könnte), aber ich dachte, es wäre hilfreich, um das Problem zu verstehen. Gerne hinterlasse ich es als Kommentar.
Joeqwerty

Antworten:

10

Die richtige Planung zukünftiger Aufgaben nach Ortszeit unter Berücksichtigung von Zeitzonen und Sommerzeit ist ein sehr komplexes Thema. Ich habe hier und hier bereits aus Programmiersicht über Stack Overflow darüber geschrieben .

Ich werde aus einer nicht programmierbaren Perspektive zusammenfassen:

  • Definieren Sie Ihre Wiederholungsmuster nach Ortszeit - nicht nach UTC . Wenn Sie beispielsweise einen täglichen Wecker einstellen, der Sie jeden Tag um 8:00 Uhr aufweckt, möchten Sie nach einer Sommerzeitumstellung nicht eine Stunde früher oder eine Stunde später aufwecken. Wenn ich mich in der US-Pazifik-Zeitzone befinde, kann ich keinen Zeitplan für 16.00 Uhr UTC erstellen, da nach der Umstellung auf 15.00 Uhr UTC umgestellt werden muss, um die Ortszeit von 8.00 Uhr zu halten.

  • Definieren Sie die Zeitzone, die die "lokale" Zeit darstellt. Nehmen Sie nicht an, dass die lokale Zeitzone des Servers dieselbe Zeitzone ist, die für den Endbenutzer von Bedeutung ist.

  • Projizieren Sie die Ortszeit auf ein UTC-Datum und eine UTC-Zeit für jedes Ereignis, das das Ereignis auslösen soll.

    • Sie werden dies fast immer für das nächste unmittelbare Ereignis tun, sodass Sie die UTC-Uhr verwenden können, um den tatsächlichen Ausführungszeitpunkt zu bestimmen.

    • In einigen Fällen möchten Sie möglicherweise auch die nächsten (oder mehrere) Instanzen projizieren, z. B. die nächsten 5 Vorkommen oder alle Vorkommen für das nächste Jahr. (Dieser Teil ist sehr spezifisch für die Anforderungen der Anwendung.)

  • Verfügen Sie über eine Strategie (entweder fest oder konfigurierbar) für Vorkommnisse, die zum Zeitpunkt eines Übergangs zwischen Sommer- und Winterzeit auftreten:

    • Für den Übergang "Vorwärtsspringen" gibt es eine Lücke, in der die Ortszeit fehlt, wenn das Ereignis möglicherweise nicht vorhanden ist. In der US-Pazifik-Zeit beispielsweise ist eine tägliche Aufgabe, die um 2:00 Uhr Ortszeit ausgeführt werden soll, am 9. März 2014 nicht vorhanden. In den meisten Fällen möchten Sie diese Zeit um den gesparten Betrag vorverlegen (normalerweise 1 Stunde) ), an diesem Tag wird es um 3:00 Uhr morgens ausgeführt, in der nächsten Instanz wird es jedoch wieder um 2:00 Uhr morgens ausgeführt. (Es ist jedoch durchaus möglich, dass Sie hierfür eine andere Strategie wünschen.)

    • Für den "Fallback" -Übergang gibt es eine Überlappung der duplizierten Ortszeit, wenn das Vorkommen möglicherweise zweimal vorhanden ist . In der US-Pazifik-Zeit kann ein täglicher Task, der um 01:00 Uhr ausgeführt werden soll, am 2. November 2014 zu zwei möglichen Zeitpunkten ausgeführt werden. In den meisten Fällen möchten Sie ihn beim ersten Auftreten von 1 ausführen : 00 PDT und überspringen Sie das nächste Auftreten von 1:00 PST des gleichen Datums. ( Möglicherweise möchten Sie aber auch eine andere Strategie, z. B. beim zweiten Auftreten oder in beiden. YMMV)

  • Bereiten Sie sich darauf vor, alle UTC-Zeiten Ihres Auftretens neu zu berechnen, wenn Sie jemals Ihre Zeitzonendaten aktualisieren müssen. Die IANA / Olson TZDB veröffentlicht jedes Jahr mehrere Updates, da die Regierungen der Welt ihre Meinung zu Zeitzonenverschiebungen und Sommerzeitregeln ständig ändern. Sie können nicht für einen bestimmten Zeitraum in der Zukunft davon ausgehen, dass sich die Regeln nicht ändern .

    • Stellen Sie sicher, dass Sie Ankündigungen von Zeitzonendaten-Releases abonnieren und über ein Verfahren verfügen, um sie auf Ihre Systeme und / oder Anwendungen anzuwenden.

    • In einem traditionellen Unternehmensumfeld sollte dies in der Verantwortung des IT-Betriebspersonals liegen.

    • Abhängig von Ihrer Umgebung erhalten Sie diese Daten möglicherweise über tzdataLinux-Paketaktualisierungen, über Java JRE oder tzupdater oder über eine beliebige Anzahl anderer Kanäle. Manchmal ist es umgebungsspezifisch und manchmal ist es plattformspezifisch, wie das PECL-Paket timezonedb für PHP und viele andere.

    • Microsoft hat seine eigenen Zeitzonendaten. Wenn Sie unter Windows TimeZoneInfobeispielsweise .NET verwenden, verwenden Sie diese Daten. Updates kommen von hier und werden auch automatisch über Windows Update verteilt. Achten Sie daher auf diese, damit Sie wissen, wann bzw. ob Sie eine Neuberechnung durchführen müssen.

  • Wenn all dies verstanden ist, gibt es immer noch ein Szenario, in dem Sie nur nach UTC planen würden, und zwar für ABSOLUTE zukünftige Ereignisse. Beispiele:

    • Ein Job, der alle X Stunden oder alle X Minuten ausgeführt wird.

    • Start- und Stoppzeiten des Sonnenaufgangs oder andere astronomische Phänomene.

    • Ein zeitkritisches Sicherheitsfenster, z. B. beim Übertragen vertraulicher Informationen an eine andere Partei zu einem festgelegten Zeitpunkt.


Windows-Taskplaner

Windows tut nicht unbedingt das Richtige. Achten Sie darauf, wie Sie den Auslöser definieren:

Windows-Taskplaner

Wenn Sie das Kontrollkästchen "Über Zeitzonen hinweg synchronisieren" aktivieren, wird die Aufgabe nur von UTC geplant. (Alle Zeiten werden immer noch als Ortszeit angezeigt, aber als UTC gespeichert .) Dies ist also für das, was ich früher als "absolutes" Ereignis bezeichnet habe.

Wenn Sie dieses Kontrollkästchen nicht aktivieren, wird die lokale Zeitzone des Computers verwendet, auf dem der Code ausgeführt wird. Sie haben keine Möglichkeit, die Zeitzone anzugeben, daher ist dies meiner Meinung nach keine sehr gute Implementierung.

Ich bin mir nicht ganz sicher, ob es sich um eine Sommerzeit handelt, aber ich werde experimentieren und darauf zurückkommen. Es macht wahrscheinlich das, was ich oben beschrieben habe, aber nicht unbedingt.


SQL Agent

Der SQL Agent-Scheduler ist sogar noch schlimmer, da Sie nur die lokale Serverzeit verwenden können. Auch hier können keine Zeitzonen angegeben werden, und Sie können auch keine UTC-Zeit angeben.

Es wurde angefordert , aber nicht akzeptiert.

Matt Johnson-Pint
quelle
Unterm Strich müssen Sie also mit den spezifischen Tools SQL Agent und Windows Task Scheduler jedes Mal manuelle Änderungen vornehmen, oder? Möglicherweise könnte der vom Scheduler ausgeführte Code die UTC-Zeit erneut überprüfen und dann möglicherweise eine Verzögerung (im Herbst) durchführen, aber nur durch eine manuelle Änderung kann vermieden werden, dass der Job im Frühjahr ausgeführt wird. Oder vielleicht ein Skript, um den Zeitplan tatsächlich neu zu programmieren?
NealWalters
Ich habe die Antwort mit Informationen zu Windows Task Scheduler und SQL Agent aktualisiert. Weder machen es ganz richtig. Wenn Sie Ihre eigene Lösung entwickeln möchten, sollten Sie sich Quartz.net ansehen .
Matt Johnson-Pint
Kurzfristig könnten Sie den Windows-Taskplaner verwenden, wenn dieses Kontrollkästchen aktiviert ist, um festzulegen, welche Aufgaben zu bestimmten UTC-Zeiten ausgeführt werden sollen. Aber wahrscheinlich möchten Sie, dass dies einmalige Aufgaben sind, die Sie programmgesteuert aus Ihrem eigenen Code erstellen, damit Sie den Rest berücksichtigen können.
Matt Johnson-Pint
Noch eine tolle Antwort!
NealWalters
1

Indem man sich im Allgemeinen nicht darum kümmert.

Stellen Sie die Frage "Was ist, wenn die Aufgabe zweimal ausgeführt wird?"

Im Allgemeinen spielt es keine Rolle, Sie müssen also nichts unternehmen. Wenn es darauf ankommt, ist die einfachste Lösung, den Job außerhalb der von der Sommerzeitumstellung betroffenen Stunde zu verschieben.

HopelessN00b
quelle
Wenn es mich nicht interessiert hätte, hätte ich nicht gefragt. Manche sind wichtig, manche nicht. Um 2:00 Uhr haben wir Jobs, die Dateien extrahieren und an unsere Lieferanten senden. Ich glaube nicht, dass 2:00 sich wiederholen wird. Wir werden auf 2:05 umsteigen, nur um eine zusätzliche Versicherung abzuschließen. Wir haben Backups, Smart-Index-Jobs usw., aber zum Glück sind sie später.
NealWalters
1
@NealWalters Ich denke , es ist ein wichtiger Punkt, fair zu hopelessnoob zu sein: Wenn es nicht der Fall ist unabhängig davon , ob eine Aufgabe ausgeführt wird zweimal dann , warum Sorge. Ich weiß nicht über dich Bescheid, aber ich habe viele Dinge, um die ich mich sorgen muss, ohne mich um die Dinge zu kümmern, um die ich mich nicht kümmern muss. Wenn es tut Angelegenheit dann sollten Sie bereits Codierung es etwas Vernunft Prüfung zu tun sowieso . Trotzdem ist es sicherlich eine gute Idee, zu vermeiden, dass Dinge genau zu dem Zeitpunkt geplant werden, an dem die Uhren zurückgehen - das ist nur eine Bitte um Ärger.
Rob Moir
Es ist nicht meine Wahl, wir senden um diese Uhrzeit Extraktdateien an Flughäfen, und genau zu diesem Zeitpunkt möchten sie die Datei haben. Wir verwenden BizTalk, ein auf Nachrichten basierendes System, das so schwer zu überprüfen ist. Es ist etwas enttäuschend, dass der SQL-Scheduler und der Windows-Taskplaner keine tägliche UTC-Zeit zulassen.
NealWalters
1

Wie Sie bereits bemerkt haben, wird die Stunde zwischen 1:00 und 02:00 Uhr am Ende der Sommerzeit wiederholt. Wenn die umgekehrte Änderung auftritt (der Start der Sommerzeit), werden die Zeiten zwischen 2 Uhr morgens und 3 Uhr morgens nicht auftreten (und Ihr Job wird nicht ausgeführt). Ihre besten Optionen werden sein

  • Führen Sie den Job-Zeitplan auf UTC aus
  • Führen Sie den Job zu einem Zeitpunkt außerhalb der Umstellung aus (00:59 Uhr oder 03:00 Uhr).
Andrew
quelle