Cronjobs und Zeitzonen
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Cronjobs und Zeitzonen
Auf einem Anwendungsserver verwende ich UTC als Zeitzone. In der Sommerzeit beträgt der Unterschied zwischen meiner lokalen Zeitzone zwei Stunden zum Server, in der Winterzeit ist es nur eine Stunde.
Auf dem Server laufen einige Cronjobs, welche E-Mails versenden. Der E-Mail-Versand soll zu einem bestimmten Zeitpunkt erfolgen, z.B. auf 12 Uhr mittags und 18 Uhr abends, damit man gewissen Vorgänge vom Vormittag und Nachmittag auseinanderhalten kann. Im Winter kann man diese Cronjobs auf 11 bzw. 17 Uhr konfigurieren, im Sommer müsste es jedoch 10 bzw. 16 Uhr sein, damit die Benutzer ihre E-Mails immer um 12 bzw. 18 Uhr erhalten. (Ich hoffe, dass ich das richtig gerechnet habe.) Dadurch muss ich die Zeiten der Cronjobs zweimal pro Jahr anpassen, was zwar nicht tragisch ist, jedoch dem Automatisierungsgedanken entgegenläuft.
Nun meine Frage: Gibt es eine Möglichkeit, die Cronjobs an Sommer- und Winterzeit anzupassen, ohne die Zeitzone des Servers zu ändern?
Auf dem Server laufen einige Cronjobs, welche E-Mails versenden. Der E-Mail-Versand soll zu einem bestimmten Zeitpunkt erfolgen, z.B. auf 12 Uhr mittags und 18 Uhr abends, damit man gewissen Vorgänge vom Vormittag und Nachmittag auseinanderhalten kann. Im Winter kann man diese Cronjobs auf 11 bzw. 17 Uhr konfigurieren, im Sommer müsste es jedoch 10 bzw. 16 Uhr sein, damit die Benutzer ihre E-Mails immer um 12 bzw. 18 Uhr erhalten. (Ich hoffe, dass ich das richtig gerechnet habe.) Dadurch muss ich die Zeiten der Cronjobs zweimal pro Jahr anpassen, was zwar nicht tragisch ist, jedoch dem Automatisierungsgedanken entgegenläuft.
Nun meine Frage: Gibt es eine Möglichkeit, die Cronjobs an Sommer- und Winterzeit anzupassen, ohne die Zeitzone des Servers zu ändern?
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Warum stellst du bei dem Server nicht die korrekte Zeitzone ein? Damit würde sich dein Problem, die Cronjobs zweimal im Jahr anpassen zu müssen, erübrigen.
Intern läuft Linux ohnehin immer mit UTC. Die Zeitstempel im Dateisystem sind beispielsweise immer in UTC und werden von Programmen wie "ls" on-the-fly auf die eingestellte Zeitzone umgerechnet.
Intern läuft Linux ohnehin immer mit UTC. Die Zeitstempel im Dateisystem sind beispielsweise immer in UTC und werden von Programmen wie "ls" on-the-fly auf die eingestellte Zeitzone umgerechnet.
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Die ganze Infrastruktur von ca. 60 Servern in der Cloud (an verschiedensten Orten) war immer auf UTC eingestellt. Den genauen Grund dafür kenne ich nicht, dass eine Umstellung aber ohne jegliche Konsequenzen sein wird, glaube ich jedoch nicht. Hat vielleicht jemand Erfahrung damit?MSfree hat geschrieben:04.04.2023 08:22:35Warum stellst du bei dem Server nicht die korrekte Zeitzone ein? Damit würde sich dein Problem, die Cronjobs zweimal im Jahr anpassen zu müssen, erübrigen.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Ich denke das sollte mit timer-units (statt den cronjobs) möglich sein. In der timer-unit kannst Du ein "calendar event" mit Angabe der lokalen timezone benutzen. D. h. die Zeitzone des Servers bleibt auf UTC und die Ausführung der timer-unit passiert gemäß der Uhrzeit aus der (lokalen) Zeitzone Europe/Berlin (d. h. CEST/CET). Das kann man ja mal testen.paedubucher hat geschrieben:04.04.2023 08:07:23Nun meine Frage: Gibt es eine Möglichkeit, die Cronjobs an Sommer- und Winterzeit anzupassen, ohne die Zeitzone des Servers zu ändern?
Re: Cronjobs und Zeitzonen
Ich auch etwas doof, dass Cron die Zeitzone aus /etc/timezone liest und man sie beim Start oder ueber ein Configfile nicht von der Systemeinstellung abweichend setzen kann.
Aber vielleicht kann eine alternative Cron-Implementierung das. In diese Richtung koenntest du mal noch recherchieren.
Aber vielleicht kann eine alternative Cron-Implementierung das. In diese Richtung koenntest du mal noch recherchieren.
Use ed once in a while!
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Ja, eine Timer Unit wäre eine Alternative dazu:
Da wir eh überall systemd verwenden, wäre das sicherlich nicht verkehrt.
Code: Alles auswählen
$ systemd-analyze calendar '12:00 Europe/Zurich'
Original form: 12:00 Europe/Zurich
Normalized form: *-*-* 12:00:00 Europe/Zurich
Next elapse: Tue 2023-04-04 12:00:00 CEST
(in UTC): Tue 2023-04-04 10:00:00 UTC
From now: 2h 59min left
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Wär ein systemd.timer eine Option? Da könnte man Zeitzonen angeben:
Edit: Ah, zu spät
Code: Alles auswählen
OnCalendar=Mon *-*-* 13:37:42 Europe/Berlin
Edit: Ah, zu spät
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Cronjobs und Zeitzonen
Alternative zur Timer-Unit:
Du könntest jeweils um 10 Uhr und um 11 Uhr UTC per cron ein Wrapperscript starten, das die Lokalzeit abfragt und abhängig vom Ergebnis den eigentlichen Job startet. Für 18 Uhr CE(S)T machst du dann genau das Gleiche.
Du könntest jeweils um 10 Uhr und um 11 Uhr UTC per cron ein Wrapperscript starten, das die Lokalzeit abfragt und abhängig vom Ergebnis den eigentlichen Job startet. Für 18 Uhr CE(S)T machst du dann genau das Gleiche.
Re: Cronjobs und Zeitzonen
Das ginge sogar generisch:hikaru hat geschrieben:04.04.2023 09:05:12Alternative zur Timer-Unit:
Du könntest jeweils um 10 Uhr und um 11 Uhr UTC per cron ein Wrapperscript starten, das die Lokalzeit abfragt und abhängig vom Ergebnis den eigentlichen Job startet. Für 18 Uhr CE(S)T machst du dann genau das Gleiche.
Code: Alles auswählen
0 * * * * hourcheck 12 /path/to/programm arg1 arg2
Code: Alles auswählen
#!/bin/sh
if "$1" -ne `date +%H` ; then
exit 0
fi
shift
"$@"
Use ed once in a while!
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Müsste ich dann nicht `TZ=Europe/Zurich date +%H` verwenden?Meillo hat geschrieben:04.04.2023 09:26:02Das ginge sogar generisch:hikaru hat geschrieben:04.04.2023 09:05:12Alternative zur Timer-Unit:
Du könntest jeweils um 10 Uhr und um 11 Uhr UTC per cron ein Wrapperscript starten, das die Lokalzeit abfragt und abhängig vom Ergebnis den eigentlichen Job startet. Für 18 Uhr CE(S)T machst du dann genau das Gleiche.Und dann hourcheck in etwa so:Code: Alles auswählen
0 * * * * hourcheck 12 /path/to/programm arg1 arg2
Code: Alles auswählen
#!/bin/sh if "$1" -ne `date +%H` ; then exit 0 fi shift "$@"
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Aeh, ja, vermutlich. Das war als Antwort zum Mitdenken gedacht. Du hast sie gemeistert.paedubucher hat geschrieben:04.04.2023 10:18:39Müsste ich dann nicht `TZ=Europe/Zurich date +%H` verwenden?
Use ed once in a while!
Re: Cronjobs und Zeitzonen
Ja. Ich war mir aber nicht sicher ob das bei nur zwei Programmaufrufen am Tag noch "elegant" ist, denn dann rufst du das Script 20 mal am Tag völlig unnötig auf.
Re: Cronjobs und Zeitzonen
Wenn das alles Linuxkisten sind, läuft die Systemuhr sowieso immer in UTC. Die Zeitzone ist nur für Anzeigezwecke und z.B. für cron wichtig.paedubucher hat geschrieben:04.04.2023 08:31:55Die ganze Infrastruktur von ca. 60 Servern in der Cloud (an verschiedensten Orten) war immer auf UTC eingestellt. Den genauen Grund dafür kenne ich nicht,
Doch, sie ist ohne jegliche Konsequenzen.dass eine Umstellung aber ohne jegliche Konsequenzen sein wird, glaube ich jedoch nicht.
Re: Cronjobs und Zeitzonen
Wahrscheinlich haben wir da ein bisschen aneinander vorbei geredet. Mir geht es nicht darum, wie oft das Script aufgerufen wird. D.h. Man koennte den Stundenstern in der Crontab auch einschraenken. Mir ging es stattdessen darum, dass das Wrapperscript keine Kenntnis von relevanten Stunden hat, sondern die gewuenschte Zeit als Parameter mitgegeben wird, damit alle Information nur in der Crontab liegt und das Wrapperscript selbst generisch ist. Vielleicht hattest du das auch schon so gedacht und ich dich nur anders interpretiert.
(Ergaenzung: Hundert unnoetige Aufrufe am Tag eines kleinen Scripts, das gleich wieder aussteigt, sind mir gemeinhin egal. Erst wenn das wirklich ein Performanceproblem darstellt oder die Logs spuerbar zumuellt, kuemmere ich mich darum. Sonst ist mir mehr Generalitaet, Einfachheit und Robustheit meist wichtiger. Wenn ich nur einmal einen Fehler suchen muss, weil die Zeitzone drei Stunden von UTC abweicht und ich das bei den Cron-Stunden nicht beruecksichtigt habe, dann hat es sich schon nicht mehr gelohnt, etwas Performance sparen zu wollen ... zumindest aus meiner Sicht.)
Use ed once in a while!
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Noch besser: Die Zeitzone als Kommandozeilenparameter mitgeben!Meillo hat geschrieben:04.04.2023 10:22:04Aeh, ja, vermutlich. Das war als Antwort zum Mitdenken gedacht. Du hast sie gemeistert.paedubucher hat geschrieben:04.04.2023 10:18:39Müsste ich dann nicht `TZ=Europe/Zurich date +%H` verwenden?
Code: Alles auswählen
hourcheck 12 Europe/Zurich /path/to/job
Die Timer-Units schaue ich mir dann einmal in Ruhe an, wenn ich ein neues Setup mache.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Du könntest ja auch zu den gewohnten Zeiten den hourcheck starten. Wenn die Zeit passt startest Du das Programm, das zu der Zeit laufen soll. Ansonsten startest Du es mit at eine Stunde später.
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Ich nehme an, at müsste ich dann auch wieder mit einer entsprechenden Zeitzone starten, oder?chrbr hat geschrieben:04.04.2023 12:30:36Du könntest ja auch zu den gewohnten Zeiten den hourcheck starten. Wenn die Zeit passt startest Du das Programm, das zu der Zeit laufen soll. Ansonsten startest Du es mit at eine Stunde später.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Du kannst `at' mit absoluten oder relativen Zeitangaben starten:paedubucher hat geschrieben:04.04.2023 15:39:07Ich nehme an, at müsste ich dann auch wieder mit einer entsprechenden Zeitzone starten, oder?chrbr hat geschrieben:04.04.2023 12:30:36Du könntest ja auch zu den gewohnten Zeiten den hourcheck starten. Wenn die Zeit passt startest Du das Programm, das zu der Zeit laufen soll. Ansonsten startest Du es mit at eine Stunde später.
Code: Alles auswählen
at now + 1 hour
Use ed once in a while!
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Danke; mit at hatte ich bisher noch nie gearbeitet. Am besten versuche ich einmal beide Lösungen, um sie besser vergleichen zu können.Meillo hat geschrieben:04.04.2023 15:45:12Du kannst `at' mit absoluten oder relativen Zeitangaben starten:paedubucher hat geschrieben:04.04.2023 15:39:07Ich nehme an, at müsste ich dann auch wieder mit einer entsprechenden Zeitzone starten, oder?chrbr hat geschrieben:04.04.2023 12:30:36Du könntest ja auch zu den gewohnten Zeiten den hourcheck starten. Wenn die Zeit passt startest Du das Programm, das zu der Zeit laufen soll. Ansonsten startest Du es mit at eine Stunde später.Code: Alles auswählen
at now + 1 hour
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Cronjobs und Zeitzonen
Ich bin mal gespannt. Mit Linux führen viele Wege zum Ziel.
Re: Cronjobs und Zeitzonen
Du könntest dir auch dabei eine Rechnerei mit +1h oder +2h sparen und jeden Tag um Mitternacht@UTC einpaedubucher hat geschrieben:04.04.2023 15:47:50Danke; mit at hatte ich bisher noch nie gearbeitet. Am besten versuche ich einmal beide Lösungen, um sie besser vergleichen zu können.
Code: Alles auswählen
TZ=Europe/Berlin at 13:37
Neben at gibts übrigens auch noch
Code: Alles auswählen
systemd-run --on-calendar=…
Manchmal bekannt als Just (another) Terminal Hacker.
Re: Cronjobs und Zeitzonen
Hast du getestet, ob das funktioniert? `at' ist meist ueber `cron' implementiert, bzw. arbeitet Cron die At-Jobs ab. Ich kann mir gut vorstellen, dass `at' die Zeiten umrechnet, bin mir aber nicht sicher.JTH hat geschrieben:04.04.2023 16:23:08Du könntest dir auch dabei eine Rechnerei mit +1h oder +2h sparen und jeden Tag um Mitternacht@UTC einausführen.Code: Alles auswählen
TZ=Europe/Berlin at 13:37
Use ed once in a while!
Re: Cronjobs und Zeitzonen
Ja, schien mir mit zwei kurzen Probeaufrufen zu tun, was es sollte. Aber ohne Gewähr.
Also die dem at übergebene Uhrzeit sollte dann in der lokalen „Ziel“zeit sein.
Manchmal bekannt als Just (another) Terminal Hacker.
- heisenberg
- Beiträge: 3558
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Cronjobs und Zeitzonen
Könnte ein Problem von Servern, die nicht auf UTC eingestellt sind und in verschiedene Zeitzonen laufen nicht erschwertes Debugging sein?
Sprich: Wenn Server interagieren, man möchte Vorgänge serverübergreifend nachverfolgen und dann sind in den Logs jeweils lokaler Zeit abgespeichert?
Sprich: Wenn Server interagieren, man möchte Vorgänge serverübergreifend nachverfolgen und dann sind in den Logs jeweils lokaler Zeit abgespeichert?
Jede Rohheit hat ihren Ursprung in einer Schwäche.
- paedubucher
- Beiträge: 856
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Cronjobs und Zeitzonen
Tatsächlich ziehen wir die Logs verschiedener Server zusammen und gehen überall von UTC aus. Von daher ist eine einheitliche Zeitzone sicherlich sinnvoll. Aber den genauen Grund für die Wahl von UTC kenne ich leider auch nicht. Ich dachte, das sei gängige Praxis...heisenberg hat geschrieben:04.04.2023 22:17:02Könnte ein Problem von Servern, die nicht auf UTC eingestellt sind und in verschiedene Zeitzonen laufen nicht erschwertes Debugging sein?
Sprich: Wenn Server interagieren, man möchte Vorgänge serverübergreifend nachverfolgen und dann sind in den Logs jeweils lokaler Zeit abgespeichert?
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.