Automatycznie ustaw strefę czasową systemu Linux zgodnie z lokalizacją


19

Jak możemy automatycznie ustawić domyślną strefę czasową systemu w systemie Linux za pomocą Internetu? Widzę, że serwery NTP mogą aktualizować tylko czas, ale nie strefę czasową. Czy jest jakiś serwer, który może zmienić strefę czasową?


1
Czy mówisz, że zmiana strefy czasowej z oszczędności światła dziennego na czas standardowy?
slm

Tutaj są dwie rzeczy. 1. jeśli nastąpi zmiana w kraju. 2. sekunda, jeśli nastąpi zmiana oszczędności światła dziennego.
Embedded Programmer

Serwery NTTP automatycznie obsługują zmiany czasu letniego. Nie znam żadnych serwerów, które wykrywają Twoją lokalizację i automatycznie aktualizują strefę czasową (tak jak robi to telefon komórkowy).
drs

2
@drs Dokładniej, NTP w ogóle nie dba o strefę czasową. Czas NTP to czas UTC, prosty i prosty, a konwersja strefy czasowej jest do wykonania przez klienta. Konkretny klient NTP może wykonać konwersję strefy czasowej lub nie, ale ponieważ większość systemów * nix i tak ustawia zegar systemowy na UTC, nie powinno tak być.
CVn

Odpowiedzi:


36

Jakiś czas temu napisałem program, który to robi: tzupdate .

Możesz zobaczyć, co ustawiłoby twoją strefę czasową (bez ustawiania jej), uruchamiając tzupdate -p:

$ tzupdate -p
Europe/Malta

Możesz ustawić to naprawdę, uruchamiając tzupdatejako root.

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

Działa to przez:

  • Geolokalizacja bieżącego adresu IP
  • Uzyskiwanie strefy czasowej dla tej lokalizacji
  • Aktualizacja dowiązania symbolicznego w /etc/localtimecelu wskazania pliku zoneinfo dla tej strefy czasowej

6

Jest to stary wątek, ale nadal istotny dla kubuntu 1710, który nie zmienia automatycznie strefy czasowej. Korzystam z rozwiązania Chrisa Downa dla tzupdate, ale zapewniam również, że zostanie on uruchomiony, gdy system spróbuje połączyć się z siecią (Wi-Fi lub inną). Zakłada się, że używasz Network Managera.

Najpierw otwórz terminal.

  1. Zainstaluj tzupdate

    sudo apt install python-pip
    pip install -U tzupdate
    

    Następnie upewnij się, że jest dostępny dla wszystkich użytkowników

    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. Sprawdź, czy to działa

    sudo tzupdate
    
  3. Następnie musimy upewnić się, że jest to dostępne dla wszystkich użytkowników

    sudo su -
    tzupdate
    

    który wpuszcza Cię jako root, a następnie sprawdza, czy polecenie zmienia strefę czasową. Następnie upewnij się, że wyjdziesz, aby powrócić jako zwykły użytkownik

    exit
    
  4. Upewnij się, że tzupdate można uruchomić z sudo bez hasła. Jest to potrzebne na późniejszym etapie, gdy uruchomimy to z menedżera sieci, który uruchamia to w tle. Wpisz to w terminalu, aby edytować plik sudoers

    sudo visudo
    

    Dodaj ten wiersz na końcu pliku

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

    Naciśnij CTRL-X, a następnie naciśnij Y, a następnie ENTER, aby zapisać zmiany

  5. Następnie zapewniamy, że NetworkManager zawsze wywołuje to po wywołaniu zmiany połączenia sieciowego (np. Podczas łączenia z Wi-Fi). W tym celu tworzymy plik o nazwie tzupdate w folderze dispatcher.d, który po prostu wywołuje sudo tzupdate. Plik wymaga uprawnień wykonywalnych do uruchomienia

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

    Zauważ, że NetworkManager wywoła polecenie wykonania sudo (tj. Sudo tzupdate), które zwykle monituje o podanie hasła.

    Może być lepszy sposób, aby to zrobić, to znaczy, aby NetworkManager wywoływał to tylko wtedy, gdy podnosi połączenie, a nie również w dół (tak jak powyżej) - Próbowałem umieścić skrypt w / etc / network / if-up .d, ale to nie zadziałało dla mnie

  6. Aby przetestować to w Kubuntu - zmień lokalną strefę czasową na coś innego (przejdź do plazmy Data na pasku zadań i kliknij prawym przyciskiem myszy i wybierz „Dostosuj datę / godzinę”, a następnie „Strefa czasowa” na karcie)

    Wyłącz Wi-Fi i włącz ponownie - zobaczysz, że po połączeniu z Wi-Fi zdaje się czekać około 30 sekund, a następnie powinien pomyślnie zmienić strefę czasową.

    Pamiętaj, że nie zostało to przetestowane z Wi-Fi, w którym należy wprowadzić hasło na stronie internetowej. Mam nadzieję, że fakt, że działa to na samym końcu połączenia sieciowego, powinien zapewnić użytkownikowi wystarczającą ilość czasu na wprowadzenie poświadczeń - w przeciwnym razie może to wymagać dalszych poprawek (sprawdź, czy połączenie istnieje, sprawdź, czy możesz połączyć się z Internetem, poczekaj przez X sekund, jeśli nie można połączyć się z Internetem, a następnie spróbuj ponownie razy Y.


2
Szkoda, że ​​w 2018 r. To wciąż poprawna odpowiedź. Wierzę, że Gnome ma pakiet (zegary gnome), który sobie z tym poradzi, ale w KDE nie ma obecnie innego dobrego rozwiązania.
kardonator

Możesz zrobić „if [" $ 2 ”=" up "]", aby sprawdzić, czy połączenie sieciowe jest uruchomione przed uruchomieniem polecenia. Drugim parms jest stan nazywany przez NM.
flamusdiu

-2

Nie jest jasne, co rozumiesz przez „aktualizację strefy czasowej”.

Unix i Linux zachowują czas jako liczbę sekund od 1 stycznia 1970 roku, 00:00 UTC. Zegar systemu Unix jest zatem niezależny od strefy czasowej. Strefy czasowe nie istnieją w jądrze Linuksa; tylko wtedy, gdy aplikacja przestrzeni użytkownika wyświetla czas, liczba sekund od 1970 roku jest interpretowana przy użyciu strefy czasowej. Zwykle interpretacja ta odbywa się za pomocą funkcji biblioteki C. Strefa czasowa jest wybierana przez TZzmienną środowiskową. Definicje stref czasowych (które składają się z nazwy strefy czasowej, przesunięcia w stosunku do UTC, dat, kiedy obowiązuje czas letni i przesunięcia w czasie DST) są częścią GNU libc i zwykle są zawarte w dystrybucjach Linuksa jako pakiet „tzdata”. Dlatego aktualizacja definicji strefy czasowej jest kwestią uruchomiony apt-get upgrade, yum updatelub jakiegoś podobnego działania.

Należy pamiętać, że niektóre programy, takie jak Java, mają własne pliki definicji stref czasowych, które należy osobno aktualizować.

NTP śledzi liczbę sekund od 1 stycznia 1900 roku UTC . Dlatego NTP, podobnie jak jądro Uniksa, nie ma pojęcia stref czasowych.


2
Aktualizacja strefy czasowej, widzimy, że polecenie „data” wypisze czas i datę zgodnie z / etc / localtime strefę czasową, możemy zmienić strefę czasową ręcznie, tworząc symboliczny link / usr / share / zoneinfo / America / Los_Angeles. ale jest to ręczny sposób. Chcę, powinna automatycznie aktualizować strefę czasową kraju, w którym jestem, zamiast robić to ręcznie.
Embedded Programmer

Mówiąc prościej, to na czas lokalny, automatyczne aktualizacje stref czasowych są potrzebne tylko dla osób, które dużo podróżują.
Cestarian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.