Definir automaticamente o fuso horário do Linux de acordo com o local

19

Como podemos definir automaticamente o fuso horário padrão do sistema no Linux usando a Internet? A meu ver, os servidores NTP podem atualizar apenas o tempo, mas não o fuso horário. Existe algum servidor que possa alterar o fuso horário?

Programador incorporado
fonte
1
Você está dizendo que o fuso horário muda do horário de verão para o horário padrão?
slm
Aqui há duas coisas. 1.se houver mudança no país. 2. segundo se houver alteração no horário de verão.
Programador incorporado
servidores ntp manipulam alterações no horário de verão automaticamente. Não conheço nenhum servidor que detecte sua localização e atualize seu fuso horário automaticamente (como faz um telefone celular).
drs 12/09
2
@drs Mais precisamente, o NTP não se importa com o fuso horário. A hora NTP é UTC, pura e simples, e a conversão de fuso horário é para o cliente executar. Um cliente NTP específico pode fazer a conversão do fuso horário, ou não, mas como a maioria dos sistemas * nix tem o relógio do sistema definido como UTC de qualquer maneira, não seria necessário.
um CVn

Respostas:

36

Eu escrevi um programa há um tempo atrás que faz isso: tzupdate .

Você pode ver o que definiria seu fuso horário (sem realmente defini-lo) executando tzupdate -p:

$ tzupdate -p
Europe/Malta

Você pode configurá-lo para real executando tzupdatecomo root.

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

Isso funciona por:

  • Localização geográfica do seu IP atual
  • Obtendo o fuso horário para esse local
  • Atualizando o link simbólico em /etc/localtimepara apontar para o arquivo zoneinfo para esse fuso horário
Chris Down
fonte
6

Este é um tópico antigo, mas ainda relevante para o kubuntu 1710, que não muda o fuso horário automaticamente. Estou usando a solução de Chris Down para o tzupdate, mas garantindo também que ele seja acionado quando o sistema tentar se conectar a uma rede (wifi ou outra). Isso pressupõe que você esteja usando o Network Manager.

Abra um terminal primeiro.

  1. Instale o tzupdate

    sudo apt install python-pip
    pip install -U tzupdate
    

    Em seguida, verifique se ele está acessível a todos os usuários

    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. Teste se funciona

    sudo tzupdate
    
  3. Precisamos, então, garantir que isso seja acessível a todos os usuários

    sudo su -
    tzupdate
    

    que coloca você como root e depois verifica se o comando altera seu fuso horário. Depois, certifique-se de sair para retornar como usuário normal

    exit
    
  4. Certifique-se de que o tzupdate possa ser executado com o sudo sem uma senha. Isso é necessário para uma etapa posterior quando acionamos isso do networkmanager, que executa isso em segundo plano. Digite isso em um terminal para editar o arquivo sudoers

    sudo visudo
    

    Adicione esta linha no final do arquivo

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

    Pressione CTRL-X e pressione Y e ENTER para salvar as alterações.

  5. Depois, garantimos que o NetworkManager sempre chame isso depois de acionar uma alteração na conexão de rede (por exemplo, ao conectar a um wifi). Para isso, criamos um arquivo chamado tzupdate na pasta dispatcher.d que simplesmente chama sudo tzupdate. O arquivo precisa de permissões executáveis ​​para executar

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

    Observe que o NetworkManager chamará execute sudo (ou seja, sudo tzupdate), que normalmente solicitará uma senha.

    Pode haver uma maneira melhor de fazer isso, ou seja, fazer com que o NetworkManager chame isso somente quando houver uma conexão ativa e não desativada (como o descrito acima) - tentei colocar o script em / etc / network / if-up .d mas isso não funcionou para mim

  6. Para testar isso no Kubuntu - Altere o fuso horário local para outra coisa (vá para o plasmoid Date na barra de tarefas e clique com o botão direito do mouse e selecione 'Adjust Date / Time' e depois 'TimeZone' na guia)

    Desligue o wifi e ligue-o novamente - você verá que, uma vez conectado ao wifi, ele espera cerca de 30 segundos e deve alterar o fuso horário com êxito.

    Observe que isso não foi testado com wifi, onde é necessário digitar uma senha em uma página da web. Espero que o fato de isso ser executado no final de uma conexão de rede deva fornecer tempo suficiente para que um usuário insira credenciais - caso contrário, isso poderá precisar de ajustes adicionais (verifique se existe uma conexão, verifique se você consegue se conectar à Internet, aguarde por X segundos, se não conseguir se conectar à Internet, e tente novamente Y vezes

Bharat Rajagopalan
fonte
2
É uma pena que em 2018 essa ainda seja a resposta correta. Eu acredito que o Gnome tem um pacote (gnome-clocks) que irá lidar com isso, mas no KDE não há outra boa solução atualmente.
21418 cardonator
Você pode fazer "if [" $ 2 "=" up "]" para verificar se a conexão de rede está ativa antes de executar o comando. O segundo parms é o estado que está sendo chamado pelo NM.
flamusdiu
-2

Não está claro o que você quer dizer com "atualização de fuso horário".

Unix e Linux mantêm o tempo como o número de segundos desde 1 de janeiro de 1970, 00:00 UTC. O relógio do sistema Unix é, portanto, independente do fuso horário. Os fusos horários não existem no kernel do Linux; é somente quando um aplicativo de espaço do usuário exibe o tempo em que o número de segundos desde 1970 é interpretado usando um fuso horário. Geralmente, essa interpretação é feita através das funções da biblioteca C. O fuso horário é selecionado pela TZvariável de ambiente. As definições de fuso horário (que consistem em um nome de fuso horário, offset do UTC, datas em que o horário de verão está em vigor e as compensações durante o horário de verão) fazem parte do GNU libc e geralmente são incluídas nas distribuições do Linux como um pacote "tzdata". Portanto, atualizar as definições de fuso horário é uma questão de correr apt-get upgrade, yum updateou alguma operação similar.

Observe que alguns softwares, como Java, têm seus próprios arquivos de definição de fuso horário, que precisam ser atualizados separadamente.

O NTP mantém o controle do número de segundos desde 1º de janeiro de 1900, UTC . Portanto, o NTP, como o kernel do Unix, não tem conceito de fuso horário.

200_success
fonte
2
Atualização do fuso horário, podemos ver que o comando "date" imprimirá a hora e a data de acordo com / etc / localtime fuso horário, podemos mudar o fuso manualmente criando um link simbólico de / usr / share / zoneinfo / America / Los_Angeles. mas esta é a maneira manual de fazer. Quero, ele deve atualizar automaticamente o fuso horário do país em que estou, em vez de fazer manualmente.
Programador incorporado
Em termos simples, é por um período localizado, as atualizações automáticas de fuso horário são necessárias apenas para pessoas que viajam muito.
Cestarian 22/03