Définir automatiquement le fuseau horaire Linux en fonction de l'emplacement

19

Comment définir automatiquement le fuseau horaire par défaut du système sous Linux en utilisant Internet? À mon avis, les serveurs NTP ne peuvent mettre à jour que l'heure, mais pas le fuseau horaire. Y a-t-il un serveur qui peut changer le fuseau horaire?

Programmeur intégré
la source
1
Voulez-vous dire que le fuseau horaire passe de l'heure d'été à l'heure d'hiver?
slm
Ici, il y a deux choses. 1.s'il y a un changement dans le pays. 2. deuxième s'il y a un changement dans les économies de lumière du jour.
Programmeur intégré
Les serveurs ntp gèrent automatiquement les changements d'heure d'été. Je ne connais aucun serveur qui détecte votre emplacement et met à jour votre fuseau horaire automatiquement (comme le fait un téléphone portable).
drs
2
@drs Plus précisément, NTP ne se soucie pas du tout du fuseau horaire. L'heure NTP est UTC, simple et simple, et la conversion de fuseau horaire est à effectuer par le client. Un client NTP spécifique peut effectuer une conversion de fuseau horaire, ou non, mais comme la plupart des systèmes * nix ont de toute façon l'horloge système réglée sur UTC, cela ne devrait pas être nécessaire.
un CVn du

Réponses:

36

Il y a quelque temps, j'ai écrit un programme qui fait ça: tzupdate .

Vous pouvez voir à quoi il définirait votre fuseau horaire (sans le définir réellement) en exécutant tzupdate -p:

$ tzupdate -p
Europe/Malta

Vous pouvez le définir pour de vrai en exécutant en tzupdatetant que root.

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

Cela fonctionne par:

  • Géolocaliser votre IP actuelle
  • Obtention du fuseau horaire pour cet emplacement
  • Mise à jour du lien symbolique /etc/localtimepour pointer vers le fichier zoneinfo pour ce fuseau horaire
Chris Down
la source
6

C'est un vieux fil, mais toujours pertinent pour kubuntu 1710 qui ne change pas automatiquement le fuseau horaire. J'utilise la solution de Chris Down pour tzupdate, mais je m'assure également qu'elle se déclenche lorsque le système essaie de se connecter à un réseau (wifi ou autre). Cela suppose que vous utilisez Network Manager.

Ouvrez d'abord un terminal.

  1. Installer tzupdate

    sudo apt install python-pip
    pip install -U tzupdate
    

    Assurez-vous ensuite qu'il est accessible à tous les utilisateurs

    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. Testez que cela fonctionne

    sudo tzupdate
    
  3. Nous devons ensuite faire est de s'assurer que cela est accessible par tous les utilisateurs

    sudo su -
    tzupdate
    

    qui vous dépose en tant que root, puis vérifie que la commande modifie votre fuseau horaire. Assurez-vous ensuite de quitter pour revenir en tant qu'utilisateur normal

    exit
    
  4. Assurez-vous que tzupdate peut être exécuté avec sudo sans mot de passe. Cela est nécessaire pour une étape ultérieure lorsque nous déclenchons cela à partir de networkmanager qui l'exécute en arrière-plan. Tapez ceci dans un terminal pour modifier le fichier sudoers

    sudo visudo
    

    Ajoutez cette ligne à la fin du fichier

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

    Appuyez sur CTRL-X, puis appuyez sur Y puis sur ENTRÉE pour enregistrer les modifications

  5. Nous nous assurons ensuite que NetworkManager appelle toujours cela après avoir déclenché un changement de connexion réseau (par exemple lors de la connexion à un wifi). Pour cela, nous créons un fichier appelé tzupdate dans le dossier dispatcher.d qui appelle simplement sudo tzupdate. Le fichier a besoin d'autorisations exécutables pour s'exécuter

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

    Notez que NetworkManager appellera execute sudo (c'est-à-dire sudo tzupdate) qui demandera généralement un mot de passe.

    Il pourrait y avoir une meilleure façon de le faire, c'est-à-dire que NetworkManager n'appelle cela que lorsqu'il met en place une connexion et non pas pour le faire (comme ci-dessus) - j'ai essayé de mettre le script dans / etc / network / if-up .d mais cela n'a pas fonctionné pour moi

  6. Pour tester cela dans Kubuntu - Changez votre fuseau horaire local en quelque chose d'autre (Allez dans le plasmoïde Date dans votre barre des tâches et faites un clic droit et sélectionnez 'Ajuster la date / heure' puis 'TimeZone' dans l'onglet)

    Éteignez votre wifi et rallumez-le - vous verrez qu'une fois qu'il se connecte au wifi, il semble attendre environ 30 secondes, puis changer votre fuseau horaire avec succès.

    Notez que cela n'a pas été testé avec le wifi où il faut entrer un mot de passe sur une page Web. Espérons que le fait que cela fonctionne à la toute fin d'une connexion réseau devrait donner suffisamment de temps à un utilisateur pour entrer ses informations d'identification - sinon cela peut nécessiter des ajustements supplémentaires (vérifiez qu'une connexion existe, vérifiez que vous êtes en mesure de vous connecter à Internet, attendez pendant X secondes si vous ne pouvez pas vous connecter à Internet, puis réessayez Y fois

Bharat Rajagopalan
la source
2
C'est dommage qu'en 2018, ce soit toujours la bonne réponse. Je crois que Gnome a un paquet (gnome-clocks) qui va gérer cela mais dans KDE il n'y a pas d'autre bonne solution actuellement.
cardonateur
Vous pouvez faire "if [" $ 2 "=" up "]" pour vérifier si la connexion réseau est établie avant d'exécuter la commande. Le deuxième paramètre est quel état est appelé par NM.
flamusdiu
-2

Ce que vous entendez par "mise à jour du fuseau horaire" n'est pas clair.

Unix et Linux gardent le temps en nombre de secondes depuis le 1er janvier 1970 à 00h00 UTC. L'horloge système Unix est donc indépendante du fuseau horaire. Les fuseaux horaires n'existent pas dans le noyau Linux; ce n'est que lorsqu'une application en espace utilisateur affiche le temps que le nombre de secondes depuis 1970 est interprété à l'aide d'un fuseau horaire. Habituellement, cette interprétation se fait via les fonctions de la bibliothèque C. Le fuseau horaire est sélectionné par la TZvariable d'environnement. Les définitions de fuseau horaire (qui consistent en un nom de fuseau horaire, décalé de l'UTC, les dates auxquelles l'heure d'été est en vigueur et les décalages pendant l'heure d'été) font partie de GNU libc et sont généralement incluses dans les distributions Linux en tant que package "tzdata". Par conséquent, la mise à jour des définitions de fuseau horaire est une question de fonctionnement apt-get upgrade, yum updateou une opération similaire.

Notez que certains logiciels, tels que Java, ont leurs propres fichiers de définition de fuseau horaire, qui doivent être mis à jour séparément.

NTP garde une trace du nombre de secondes depuis le 1er janvier 1900, UTC . Par conséquent, NTP, comme le noyau Unix, n'a aucun concept de fuseaux horaires.

200_success
la source
2
Mise à jour du fuseau horaire, nous pouvons voir que la commande "date" imprimera l'heure et la date en fonction du fuseau horaire / etc / localtime, nous pouvons changer le fuseau horaire manuellement en créant un lien symbolique de / usr / share / zoneinfo / America / Los_Angeles. mais c'est une façon manuelle de faire. Je veux, il devrait mettre à jour automatiquement le fuseau horaire du pays où je me trouve, plutôt que de le faire manuellement.
Programmeur intégré
En termes simples, c'est pour une heure localisée, les mises à jour automatiques du fuseau horaire ne sont nécessaires que pour les personnes qui voyagent beaucoup.
Cestarian