Automatische Einstellung der Linux-Zeitzone entsprechend dem Standort

19

Wie kann die Standard-Zeitzone des Systems unter Linux automatisch über das Internet festgelegt werden? Aus meiner Sicht können NTP-Server nur die Uhrzeit aktualisieren, nicht jedoch die Zeitzone. Gibt es einen Server, der die Zeitzone ändern kann?

Eingebetteter Programmierer
quelle
1
Wollen Sie damit sagen, dass sich die Zeitzone von Tageslicht auf Normalzeit ändert?
slm
Hier gibt es zwei Dinge. 1.wenn sich das Land ändert. 2. Sekunde, wenn sich die Tageslichteinsparung ändert.
Embedded Programmer
NTP-Server verarbeiten Änderungen der Sommerzeit automatisch. Ich kenne keine Server, die Ihren Standort erkennen und Ihre Zeitzone automatisch aktualisieren (wie dies bei einem Mobiltelefon der Fall ist).
drs
2
@drs Genauer gesagt kümmert sich NTP überhaupt nicht um die Zeitzone. Die NTP-Zeit ist UTC, schlicht und einfach, und die Zeitzonenkonvertierung muss vom Client durchgeführt werden. Ein bestimmter NTP-Client führt möglicherweise eine Zeitzonen-Konvertierung durch oder auch nicht, aber da auf den meisten * nix-Systemen die Systemuhr ohnehin auf UTC eingestellt ist, sollte dies nicht erforderlich sein.
ein Lebenslauf vom

Antworten:

36

Ich habe vor einiger Zeit ein Programm geschrieben, das dies tut: tzupdate .

Sie können sehen, auf welche Zeitzone Ihre Zeitzone eingestellt wäre (ohne sie tatsächlich einzustellen), indem Sie Folgendes ausführen tzupdate -p:

$ tzupdate -p
Europe/Malta

Sie können es für real festlegen, indem Sie tzupdateals root ausführen.

$ sudo tzupdate
Europe/Malta
$ date
Thu 12 Sep 05:52:22 CEST 2013

Dies funktioniert durch:

  • Geolokalisierung Ihrer aktuellen IP
  • Abrufen der Zeitzone für diesen Ort
  • Aktualisieren des Symlinks unter /etc/localtime, um auf die Zoneinfo-Datei für diese Zeitzone zu verweisen
Chris Down
quelle
6

Dies ist ein alter Thread, aber immer noch relevant für Kubuntu 1710, der die Zeitzone nicht automatisch ändert. Ich verwende Chris Downs Lösung für tzupdate, stelle aber auch sicher, dass es ausgelöst wird, wenn das System versucht, eine Verbindung zu einem Netzwerk (WLAN oder anderes) herzustellen. Dies setzt voraus, dass Sie Network Manager verwenden.

Öffnen Sie zuerst ein Terminal.

  1. Installieren Sie tzupdate

    sudo apt install python-pip
    pip install -U tzupdate
    

    Stellen Sie dann sicher, dass alle Benutzer darauf zugreifen können

    sudo cp -R ~/.local/lib/python2.7/site-packages/. /usr/lib/python2.7/.
    sudo cp /home/marta_riba/.local/bin/tzupdate /usr/local/bin/tzupdate
    
  2. Testen Sie, ob es funktioniert

    sudo tzupdate
    
  3. Wir müssen dann sicherstellen, dass dies für alle Benutzer zugänglich ist

    sudo su -
    tzupdate
    

    Dadurch werden Sie als Root angemeldet und überprüfen, ob der Befehl Ihre Zeitzone ändert. Stellen Sie dann sicher, dass Sie das Programm beenden, um als normaler Benutzer zurückzukehren

    exit
    
  4. Stellen Sie sicher, dass tzupdate mit sudo ohne Kennwort ausgeführt werden kann. Dies wird für einen späteren Schritt benötigt, wenn wir dies über den Netzwerkmanager auslösen, der dies im Hintergrund ausführt. Geben Sie dies in ein Terminal ein, um die sudoers-Datei zu bearbeiten

    sudo visudo
    

    Fügen Sie diese Zeile am Ende der Datei hinzu

    ALL ALL=(root) NOPASSWD: /usr/local/bin/tzupdate
    

    Drücken Sie STRG-X und dann Y und dann EINGABE, um die Änderungen zu speichern

  5. Wir stellen dann sicher, dass NetworkManager dies immer dann aufruft, wenn eine Änderung der Netzwerkverbindung ausgelöst wird (z. B. wenn eine Verbindung zu einem WLAN hergestellt wird). Dazu erstellen wir im Ordner dispatcher.d eine Datei namens tzupdate, die einfach sudo tzupdate aufruft. Die Datei benötigt ausführbare Berechtigungen zum Ausführen

    echo 'sudo tzupdate'| sudo tee /etc/NetworkManager/dispatcher.d/99-tzupdate
    sudo chmod +x /etc/NetworkManager/dispatcher.d/99-tzupdate
    

    Beachten Sie, dass NetworkManager "execute sudo" (dh "sudo tzupdate") aufruft, wobei normalerweise ein Kennwort abgefragt wird.

    Möglicherweise gibt es eine bessere Möglichkeit, dies zu tun, dh, NetworkManager ruft dies nur auf, wenn eine Verbindung hergestellt wird, und nicht, wenn die Verbindung unterbrochen wird (wie oben beschrieben). Ich habe versucht, das Skript in / etc / network / if-up abzulegen .d aber das hat bei mir nicht geklappt

  6. Um dies in Kubuntu zu testen - Ändern Sie Ihre lokale Zeitzone in eine andere (Gehen Sie zum Datumsplasmoid in Ihrer Taskleiste und klicken Sie mit der rechten Maustaste und wählen Sie "Datum / Zeit anpassen" und dann "Zeitzone" auf der Registerkarte).

    Schalten Sie Ihr WLAN aus und wieder ein - Sie werden feststellen, dass es nach dem Herstellen der Verbindung zum WLAN anscheinend 30 Sekunden wartet und dann Ihre Zeitzone erfolgreich ändern sollte.

    Beachten Sie, dass dies nicht mit WLAN getestet wurde, bei dem auf einer Webseite ein Passwort eingegeben werden muss. Hoffentlich sollte die Tatsache, dass dies ganz am Ende einer Netzwerkverbindung ausgeführt wird, einem Benutzer genügend Zeit geben, um Anmeldeinformationen einzugeben. Andernfalls müssen möglicherweise weitere Anpassungen vorgenommen werden für X Sekunden, wenn keine Verbindung zum Internet hergestellt werden kann, und wiederholen Sie Y-mal

Bharat Rajagopalan
quelle
2
Es ist schade, dass dies im Jahr 2018 immer noch die richtige Antwort ist. Ich glaube, Gnome hat ein Paket (gnome-clocks), das dies erledigt, aber in KDE gibt es derzeit keine andere gute Lösung.
Cardonator
Sie können mit "if [" $ 2 "=" up "]" prüfen, ob die Netzwerkverbindung besteht, bevor Sie den Befehl ausführen. Der zweite Parameter ist der Zustand, der von NM aufgerufen wird.
Flamusdiu
-2

Es ist nicht klar, was Sie mit "Zeitzonenaktualisierung" meinen.

Unix und Linux geben die Zeit in Sekunden seit dem 1. Januar 1970, 00:00 UTC an. Die Unix-Systemuhr ist daher zeitzonenunabhängig. Zeitzonen existieren im Linux-Kernel nicht. Nur wenn eine Userspace-Anwendung die Zeit anzeigt, wird die Anzahl der Sekunden seit 1970 unter Verwendung einer Zeitzone interpretiert. Normalerweise erfolgt diese Interpretation über C-Bibliotheksfunktionen. Die Zeitzone wird von der TZUmgebungsvariablen ausgewählt . Die Zeitzonendefinitionen (die aus einem Zeitzonennamen, einem Versatz von UTC, dem Datum, an dem die Sommerzeit gilt, und den Versätzen während der Sommerzeit bestehen) sind Teil von GNU libc und werden in Linux-Distributionen normalerweise als "tzdata" -Paket mitgeliefert. Daher die Zeitzone Definitionen aktualisieren , ist eine Frage der Lauf apt-get upgrade, yum updateoder einem ähnlichen Betrieb.

Beachten Sie, dass manche Software, wie z. B. Java, eigene Zeitzonen-Definitionsdateien hat, die separat aktualisiert werden müssen.

NTP protokolliert die Anzahl der Sekunden seit dem 1. Januar 1900 (UTC) . Daher kennt NTP wie der Unix-Kernel keine Zeitzonen.

200_erfolg
quelle
2
Zeitzonenaktualisierung, wir können sehen, dass der Befehl "Datum" Zeit und Datum gemäß / etc / localtime Zeitzone ausgibt. Wir können die Zeitzone manuell ändern, indem wir einen symbolischen Link von / usr / share / zoneinfo / America / Los_Angeles erstellen. Dies ist jedoch eine manuelle Vorgehensweise. Ich möchte, dass die Zeitzone des Landes, in dem ich mich befinde, automatisch aktualisiert wird, anstatt manuell.
Embedded Programmer
In einfachen Worten, es ist für eine lokalisierte Zeit, automatische Zeitzonen-Updates sind jedoch nur für Menschen erforderlich, die viel unterwegs sind.
Cestarian