- Ein Hinweis auf Fehler bei Cron-Jobs auf Linux-Servern während der Umstellung auf die Sommerzeit (DST)
- Zweimal im Jahr kommt es bei der Zeitumstellung sonntags um 2:00 oder 3:00 Uhr morgens dazu, dass Cron-Jobs doppelt ausgeführt oder ausgelassen werden
- In einem realen Fall wurden in einer vixie-cron-Umgebung Jobs zwischen 3:00 und 3:01 Uhr 60-mal im Abstand von 1 Sekunde wiederholt ausgeführt, was zu einer E-Mail-Flut führte
- Als Lösung werden das Setzen der Zeitzone auf UTC oder das Meiden von Jobs in diesem Zeitfenster sowie die Entwicklung eines besseren Open-Source-Schedulers vorgeschlagen
- Ein Beispiel, das Serverbetreiber und DevOps-Ingenieure an die Bedeutung des Risikomanagements bei Zeitumstellungen erinnert
Konflikte zwischen Sommerzeit und Cron-Jobs
- Wenn Cron-Jobs auf Sonntagmorgen um 2:00 oder 3:00 Uhr gelegt werden, überschneiden sie sich mit der Umstellung auf die Sommerzeit (DST) und können zu unerwarteten Ausführungsfehlern führen
- Beim Beginn der DST springt die Uhr eine Stunde vor, beim Ende eine Stunde zurück, wodurch Stunden doppelt vorkommen oder ganz entfallen
- Dadurch kann es dazu kommen, dass Jobs in bestimmten Zeitfenstern zweimal ausgeführt oder gar nicht ausgeführt werden
- Besonders Jobs, die jede Woche am frühen Sonntagmorgen laufen, sind zweimal pro Jahr von der DST-Umstellung betroffen
- Meist funktionieren sie problemlos, aber am Tag der Zeitumstellung kann es zu ungewöhnlich wiederholten Ausführungen kommen
Praxisfall: Wiederholte Ausführung in vixie-cron
- In einer Linux-Umgebung mit vixie-cron wurde berichtet, dass beim Beginn der DST Jobs zwischen 3:00 und 3:01 Uhr etwa 60-mal im Abstand von 1 Sekunde ausgeführt wurden
- Die einzelnen Jobs gerieten sich gegenseitig in die Quere und verursachten Chaos wie eine Flut von E-Mail-Benachrichtigungen
- Glücklicherweise waren diese Jobs nicht kritisch, sodass kein Systemschaden entstand
- Diese Probleme gehen auf die einfache zeitbasierte Scheduling-Struktur von Cron zurück
- Cron erkennt Änderungen der Zeitzone oder DST-Umstellungen nicht, sondern führt Jobs schlicht zur angegebenen Uhrzeit aus
Mögliche Lösungen und Alternativen
- Die einfachste Methode ist, keine Jobs sonntags früh um 2:00 und 3:00 Uhr zu planen
- Wer dieses Zeitfenster meidet, kann Probleme mit mehrfacher Ausführung durch die DST-Umstellung vollständig vermeiden
- Auch das Setzen der Server-Zeitzone auf UTC ist eine wirksame Alternative
- UTC verwendet keine Sommerzeit, daher gibt es keine Zeitumstellungen
- Als grundlegendere Lösung wird die Entwicklung eines intelligenteren Job-Schedulers vorgeschlagen
- Es wird ein Open-Source-Ersatzwerkzeug benötigt, das Funktionen wie Schutz vor Doppelstarts, Begrenzung der Laufzeit und Zeitzonenbewusstsein bietet
Langfristiger Vorschlag: Abschaffung der Sommerzeit
- Der Autor des Beitrags nennt die Abschaffung der DST auf Regierungsebene als die wünschenswerteste Lösung
- Die zweimal jährliche Zeitumstellung verursacht sowohl im Systembetrieb als auch im Alltag unnötige Komplexität
- Solange DST in der Praxis bestehen bleibt, müssen jedoch Systemadministratoren und DevOps-Ingenieure vorbeugende Maßnahmen ergreifen
- Besonders bei automatisierten Batch-Jobs, Backups, Log-Rotation und anderen zeitabhängigen Aufgaben ist Vorsicht geboten
Fazit: Prinzipien für sicheres Cron-Scheduling
- Jobs im Zeitfenster von 2:00 bis 3:00 Uhr während der DST-Umstellung sollten vermieden werden
- Wenn möglich, sollten Server auf UTC-Basis betrieben werden, um Zeitzonenprobleme zu beseitigen
- Die Grenzen von Cron sollten erkannt und der Einsatz robusterer Scheduling-Tools geprüft werden
- In DevOps-Umgebungen sind Zeitzonenmanagement und verlässliche Automatisierung unverzichtbare Aufgaben
2 Kommentare
Seit ich selbst Probleme mit einem auf 2 Uhr nachts angesetzten Job hatte (mal wurde er zweimal ausgeführt, mal gar nicht), vermeide ich diese Zeit unbedingt.
Hacker-News-Kommentare
Ich halte DST (Sommerzeit) für ein komplett verfehltes System.
Es löst keinerlei Probleme und verursacht stattdessen nur Unannehmlichkeiten.
Man sollte einfach dauerhaft bei der Standardzeit bleiben und stattdessen die Arbeitszeiten im Sommer um eine Stunde vorverlegen.
Zum Beispiel könnten Geschäfte statt um 7 Uhr schon um 6 Uhr öffnen und statt um 10 Uhr bereits um 9 Uhr schließen.
Man muss sich ohnehin zweimal im Jahr anpassen, also könnte man es auch einfach einmalig ändern.
Ich möchte nach Feierabend lieber mehr Tageslicht haben. Im Winter gilt das umso mehr, und es ist mir egal, ob auf dem Arbeitsweg die Sonne scheint.
Ich werde ohnehin 9 Stunden drinnen festsitzen, also möchte ich das Sonnenlicht dann sehen, wenn ich Freizeit habe.
Zum Beispiel gab es 1973–1975 in den USA ein Experiment mit ganzjähriger DST.
Anfangs war die Zustimmung wegen Energieeinsparungen und sinkender Kriminalität hoch,
aber nach Unfällen auf dem dunklen Schulweg am Morgen kippte die Stimmung schnell, und die Regelung wurde wieder abgeschafft.
(Wikipedia-Zitat)
Eigentlich klingt das so, als wolle man am Ende nur eine noch größere Zeitverschiebung.
Es gibt nur Standardzeit und Sommerzeit.
Die Formulierung, man wolle „Winterzeit“ dauerhaft beibehalten, wirkt psychologisch nicht besonders attraktiv.
Menschen möchten ihren Tag beginnen, wenn es bereits hell ist.
Programmierer leiden zwar unter DST, aber ich denke, das ist vor allem ein Problem sauberer Edge-Case-Behandlung.
Menschen haben unterschiedliche Schlafrhythmen; wenn jeder passendere Arbeitszeiten wählen könnte, gäbe es weniger Konflikte.
Als wir früher die reddit-Server eingerichtet haben, waren sie alle auf die Zeitzone von Arizona gestellt.
Arizona verwendet keine DST, daher beträgt der Unterschied zu Kalifornien nur eine Stunde.
Wir haben nicht UTC verwendet, weil es beim Lesen von Logs „einfacher ist, 1 statt 8 abzuziehen“.
Inzwischen gibt es ein globales Team, daher wurde alles auf UTC umgestellt.
Es ist besser, von Anfang an alles einheitlich auf UTC zu setzen.
Solche Änderungen passieren weltweit häufig, und aus Sicht von Kalender-App-Entwicklern ist das wirklich unerquicklich.
Wenn jemand UTC auswählt, sollte man davon ausgehen können, dass diese Person das Format YYYY-MM-DD mit 24-Stunden-Zeit versteht.
aber weil in der Organisation jeder sie für sich auf PST umgestellt hatte, entstand Verwirrung, da die Zeiten in den Logs unterschiedlich waren.
Am Ende griff der Leiter ein und vereinheitlichte alle Anwendungen und Datenbanken auf PST.
Trotzdem interpretiere ich UTC inzwischen fast instinktiv.
Früher hatten wir Firmenserver auf BST (Britische Sommerzeit) eingestellt und viele cron-Jobs laufen lassen,
und zweimal im Jahr gab es wieder dieselbe Verwirrung.
Bis die Firma unterging, haben wir das Problem nicht behoben.
Die Lehre ist simpel: Verwendet UTC, wenn es keinen besonderen Grund dagegen gibt.
Zum Beispiel laufen Nutzungslimit-Resets oder Abrechnungs-Batchjobs nach regionaler Zeit.
Ein Bericht für 8 Uhr in Großbritannien entspricht je nach DST einer anderen UTC-Zeit.
Deshalb reicht UTC allein nicht aus; man muss auch die Zeitzoneninformation speichern.
In einigen Ländern (Kuba, Ägypten, Libanon) erfolgt die DST-Umstellung um Mitternacht.
(passender Link)
In Brasilien war es üblich, dass die Umstellung in Zeiträume wie 00:00–01:00 oder 00:00–23:00 fiel.
Es gibt Studien, laut denen an Tagen mit DST-Umstellung Sterblichkeit und Notaufnahmebesuche stark ansteigen.
(ScienceAlert-Artikel)
Das geht weit über cron-Probleme hinaus; DST ist auch gesundheitlich schädlich.
Dieses Problem wurde schon vor langer Zeit bei OpenBSD und Debian gelöst.
Im cron(8)-Handbuch von Debian wird die Logik zur Behandlung von Zeitsprüngen unter 3 Stunden bei DST-Umstellungen beschrieben.
(Patch-Link,
Handbuch,
Bugreport)
Der Rat lautet, keine Jobs exakt um Mitternacht (00:00) zu planen.
Weil das Datum leicht für Verwirrung sorgt, ist es besser, krumme Uhrzeiten wie 00:01 oder 01:45 zu verwenden.
So lässt sich leichter nachvollziehen, was passiert ist, wenn das System zu bestimmten Zeiten seltsam reagiert.
In Umgebungen mit 12-Stunden-Uhr kann es allerdings zu Verwirrung kommen.
Bevor ich mit Zeitzonenproblemen zu tun hatte, wusste ich nicht,
dass es auf der Welt nicht existierende und mehrdeutige Uhrzeiten gibt.
Wenn zum Beispiel die Zeit von 2 auf 3 Uhr springt, existiert 2:30 nicht,
und wenn die Uhr zurückgestellt wird, kommt 2:30 zweimal vor.
Da jedes Land die DST zu einer anderen Uhrzeit umstellt, kann wie in Chile sogar Mitternacht verschwinden.
(passender Blog)
Ich erinnere mich daran, dass Java und Ruby diese Situation unterschiedlich behandelt haben und das in meinen frühen Tagen bei Stripe dreimal hintereinander zu Vorfällen führte.
Bei cron-Jobs sollte man volle Stunden vermeiden und sie nach Möglichkeit nach 4 Uhr morgens oder vor Mitternacht planen.
Auf gemeinsam genutzter Infrastruktur ist der Wettbewerb um Ressourcen zur vollen Stunde besonders stark.
sleep $(( $(od -N1 -tuC -An /dev/urandom) % 60 ))m ;voranstellen,um eine zufällige Verzögerung von 0 bis 59 Minuten einzubauen.
Wichtige geplante Jobs sollten nach Möglichkeit idempotent (sicher bei mehrfacher Ausführung) gestaltet sein.
Gerade wenn ein Queue-System beteiligt ist, ist ein solches Design entscheidend zur Vermeidung von Problemen.