Como forçar uma atualização de relógio usando o ntp?

377

Estou executando o Ubuntu em um sistema embarcado baseado em ARM que não possui um RTC com bateria. A hora do despertar está em algum lugar durante 1970. Portanto, eu uso o serviço NTP para atualizar a hora para a hora atual.

Adicionei a seguinte linha ao /etc/rc.localarquivo:

sudo ntpdate -s time.nist.gov

No entanto, após a inicialização, ainda leva alguns minutos até que o horário seja atualizado, período durante o qual não posso trabalhar efetivamente com tare make.

Como forçar uma atualização do relógio a qualquer momento?


ATUALIZAÇÃO 1: O seguinte (graças a Eric e Stephan) funciona bem na linha de comando, mas falha ao atualizar o relógio quando colocado /etc/rc.local:

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; date
Thu Jan  1 00:00:58 UTC 1970
 * Stopping NTP server ntpd     [ OK ] 
 * Starting NTP server          [ OK ] 
Thu Feb 14 18:52:21 UTC 2013

O que estou fazendo errado?


ATUALIZAÇÃO 2: Tentei seguir as poucas sugestões fornecidas em resposta à 1ª atualização, mas nada parece realmente fazer o trabalho conforme necessário. Aqui está o que eu tentei:

  1. Substitua o servidor para us.pool.ntp.org
  2. Use caminhos explícitos para os programas
  3. Remova o ntpserviço completamente e deixar apenas sudo ntpdate ...emrc.local
  4. Remova o sudocomando acima emrc.local

Usando o exposto acima, a máquina ainda inicia em 1970. No entanto, ao fazer isso na linha de comando, uma vez logado (via ssh), o relógio é atualizado assim que eu chamar ntpdate.

A última coisa que fiz foi remover isso rc.locale fazer uma chamada ntpdateno meu .bashrcarquivo. Isso atualiza o relógio conforme o esperado e recebo a hora atual verdadeira quando o prompt de comando estiver disponível.

No entanto , isso significa que, se a máquina estiver ligada e nenhum usuário estiver conectado, o tempo nunca será atualizado. É claro que posso reinstalar o ntpserviço para que pelo menos o relógio seja atualizado dentro de alguns minutos da inicialização, mas voltamos ao ponto 1.

Portanto, existe uma razão pela qual inserir o ntpdatecomando rc.localnão executa a tarefa necessária, enquanto isso .bashrcfunciona bem?

ysap
fonte
2
de [aqui] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615
4
observe o sinalizador '-b' no ntpdate. Na página de manual do ntpdate: "Força o tempo a ser aumentado usando a chamada do sistema settimeofday (), em vez de diminuído (padrão) usando a chamada do sistema adjtime (). Essa opção deve ser usada quando chamada de um arquivo de inicialização no momento da inicialização." Muitas das respostas abaixo não a incluem e isso talvez seja parte do problema de fazer as coisas funcionarem. Considere que a bandeira '-B' menciona que compensa mais de 128 ms pode levar horas para sincronizar usando o 'matou' default mecanismo
Matt S.
Não há necessidade de usar sudonos arquivos /etc/rc.locale. Eles já estão sendo executados como root.
Soren A
timedatectl, mas askubuntu.com/questions/832646/…
nobar

Respostas:

325

Provavelmente o ntpserviço está em execução, é por isso ntpdateque não é possível abrir o soquete (porta 123 UDP) e conectar-se ao servidor ntp.

Tente na linha de comando:

sudo service ntp stop
sudo ntpdate -s time.nist.gov
sudo service ntp start

Se você deseja colocar isso em /etc/rc.localuso, faça o seguinte:

( /etc/init.d/ntp stop
until ping -nq -c3 8.8.8.8; do
   echo "Waiting for network..."
done
ntpdate -s time.nist.gov
/etc/init.d/ntp start )&
Eric Carvalho
fonte
Obrigado. Você pode explicar por que precisa dos caminhos explícitos?
ysap
1
Eu realmente não sei. :-) Uma vez tive problemas ao tentar executar a servicepartir do rc.local e cron, mas consegui corrigi-lo usando o /etc/init.d/xxx. Na verdade, acho que você não precisa fornecer o caminho completo ntpdate, gosto de usar caminhos completos em scripts apenas para garantir que o arquivo correto seja encontrado.
Eric Carvalho
2
OK, este foi aparentemente o problema. Agora o relógio está sendo atualizado assim que a conexão de rede é estabelecida. Obrigado.
ysap
3
Eu descobri que o us.pool.ntp.orgé mais responsivo.
ysap
7
Com a -uopção, você não precisa interromper o serviço ntp:sudo ntpdate -u time.nist.gov
Edward Anderson
486

Em vez de ntpdate (que está obsoleto ), use

sudo service ntp stop
sudo ntpd -gq
sudo service ntp start

O -gqcomando diz ao daemon ntp para corrigir a hora, independentemente do deslocamento ( g) e sair imediatamente ( q) após definir a hora.

Martin Schröder
fonte
3
Obrigado. Ainda mostrando 1970 após este comando (w / sudo). Lendo a página de ntpdmanual, não tenho certeza de como isso força uma atualização?
ysap
12
A opção "-q" informa ao daemon NTP para iniciar, definir a hora e sair imediatamente. A opção "-g" permite corrigir diferenças de tempo maiores que 1000 segundos. Por um longo período, você deve simplesmente configurar o daemon NTP para estar sempre em execução.
tgharold 9/09/13
35
Esta resposta deve ir para o topo, porque está correta: o ntpdate está obsoleto e a instalação é uma má ideia, porque entra em conflito com o ntp. Se o relógio estiver muito lento, você precisará executar esta etapa manual, caso contrário, o ntp não mudará o relógio e não informará o motivo.
Liam
31
Para mim, sudo ntpd -gqnão sai! Estou às 14.10 e tenho que CTRL + C para continuar ... ou quanto tempo leva?
Yanick Rochon
5
Para sua informação, no meu sistema (CentOS 6.6), precisava alterar as duas instâncias de sudo service ntp...para sudo service ntpd....
Rinogo 27/01
63

Use sntp para definir a hora imediatamente. Por exemplo:

sudo sntp -s 24.56.178.140

Os números após -s podem ser qualquer servidor de horário ntp, esse é o NIST em ft. Collins, Colorado.

Convidado
fonte
1
Isso funcionou! +1
CappY
7
Isso funcionou quando "sudo ntpd -gq" não.
Matt White
Não sei quantas vezes procurei essa resposta. Funciona sempre.
Chaos
1
incapaz de localizar o pacote sntp?
temple
1
apt-get install sntp / yum install sntp (sim, ele funciona no CentOS, RedHat, fedore também)
ndemou
40

Como outros já apontaram, a melhor solução é instruir o ntpd a ignorar o limite de pânico, que é de 1000 segundos por padrão. Você pode configurar o limite de pânico de uma das duas maneiras:

  • edite /etc/default/ntpe verifique se a opção -g está presente.
  • edite o /etc/ntp.conf e coloque tinker panic 0no topo

Até agora, isso é essencialmente o que os outros recomendaram; no entanto, acho que você deve dar mais um passo. Instale o programa fake-hwclock:

# apt-get install fake-hwclock


fake-hwclock: Save/restore system clock on machines without working RTC hardware

 Some machines don't have a working realtime clock (RTC) unit, or no
 driver for the hardware that does exist. fake-hwclock is a simple set
 of scripts to save the kernel's current clock periodically (including
 at shutdown) and restore it at boot so that the system clock keeps at
 least close to realtime. This will stop some of the problems that may
 be caused by a system believing it has travelled in time back to
 1970, such as needing to perform filesystem checks at every boot.

 On top of this, use of NTP is still recommended to deal with the fake
 clock "drifting" while the hardware is halted or rebooting.

Com o fake-hwclock instalado, sua máquina não iniciará pensando que é 1970 novamente. Quando a sua máquina é inicializada, o relógio é marcado com o carimbo de data / hora fake-hwclock gravado durante a última reinicialização / desligamento. Isso significa que você pode ter um relógio um pouco correto, caso haja problemas de rede ao inicializar.

dfc
fonte
1
-gparecia fazer nada por mim (na linha de comando, eu não tenho /etc/default/ntp), mas acrescentando tinker panic 0que ntp.conftrabalhou
Dave Cousineau
@ Sauagin Eu não sei o que dizer, a não ser que você tenha um pacote ntp fora do padrão. / etc / default / ntp faz parte do pacote do Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist e -g é uma opção desde que me lembro.
quer
desculpe, acho que não estou realmente no Ubuntu e deveria ter pensado um pouco mais antes de comentar. tinker panic 0definitivamente parece ter funcionado.
Dave Cousineau
13

O ntpdate é um programa diferente do net dameon. NTPDate provavelmente está com erro na inicialização porque o ntpd está sendo executado nesse soquete.

Na linha de comandos, execute

# sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start

Você também pode desinstalar o ntpd todos juntos (apt-get remove ntp) e adicionar um script cron para usar o ntpdate a cada hora.

ATUALIZAR

O serviço NTP provavelmente não terá um valor significativo para você neste sistema, portanto remova-o primeiro.

# sudo apt-get remove ntp

Agora adicione o comando:

ntpdate -sb time.nist.gov

para /etc/rclocal

Reinicie. Deve ser bom nesse ponto.

Stephan
fonte
resposta atualizada.
Stephan
1
O ntpdate não está sendo eliminado gradualmente ou algo assim? Além disso, se eu entendi isso corretamente, o serviço executa e mantém a sincronização do relógio local com o relógio do servidor - para que o desvio seja limitado. Se você remover o ntp e executar o ntpdate uma vez, ele não será afetado pelo desvio do relógio quando a máquina estiver ligada por longos períodos?
ysap
Stephan, consulte a atualização nº 2 da pergunta.
ysap
3
Sim, o ntpdate está sendo desativado. O uso de "ntpd -q" é o preferido (ambas as variantes exigem que o ntpd seja parado primeiro).
tgharold 9/09/13
11

Use timedatectl(unidade de serviço do systemd) para definir a hora. ntpestá obsoleto.

sudo systemctl restart systemd-timesyncd.service

Você pode verificar a hora em que foi atualizada lendo os logs com journalctl -xe | tail

Referência

xiaoyifang
fonte
Isso funcionou no Ubuntu 19.04. Obrigado!
krubo 8/07
10
rdate -s tick.greyware.com

se tudo o que você quer fazer é acertar o relógio uma vez, simples

batflaps
fonte
Obrigado. No momento, não tenho o sistema para verificar esse comando, mas se você seguir a discussão na pergunta e a resposta aceita, verá que o problema era realmente a indisponibilidade da rede no momento da execução do comando clock update.
ysap 27/02
Isso corrigiu um problema de sincronização de tempo no meu Raspberry Pi. Obrigado.
Oliver Spryn 15/02
7

A maneira correta de fazer isso em um sistema Debian / Mint / Ubuntu (ou outro derivado Debian) é ter a linha

NTPD_OPTS="-g"

no arquivo

/etc/default/ntp

Isso garante que, quando o ntpd for iniciado a partir do script /etc/init.d/ntp, ele seja executado com a opção "-g", viz

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

para permitir que o ntpd corrija a hora do sistema quando houver mais de 1000 s de saída, por exemplo, quando a hora do sistema for 1º de janeiro de 1970 na inicialização, porque não há RTC de hardware.

JG Miller
fonte
Eu já tenho isso, mas ainda diz 3 da manhã em NY, quando deveria ser 11 da noite.
chovy
Eu também já tinha exatamente essa linha /etc/default/ntp, mas o tempo não estava sincronizado.
Dawid Ferenczy Rogožan
5

tlsdatedefine o relógio local conectando-se com segurança ao TLS com servidores remotos e extraindo o tempo remoto do handshake seguro. Ao contrário ntpdate, tlsdateusa o TCP, por exemplo, conectando-se a um serviço habilitado para HTTPS ou TLS remoto e fornece alguma proteção contra adversários que tentam fornecer informações de tempo mal-intencionadas.

$ tlsdate -V -n -H encrypted.google.com
Kokizzu
fonte
5

Observe que alguns sistemas atuais baseados no Ubuntu nem usam o serviço NTP por padrão agora. Na minha máquina Linux Mint 19 (Ubuntu 18.04), o tempo é mantido systemd-timesyncd.

Então, para ter um tempo atualizado após a perda de sincronização, eu apenas corro

sudo systemctl restart systemd-timesyncd

Desde 15.04, o Ubuntu usa o systemd por padrão. Portanto, sistemas críticos como o tempo são gerenciados pelo systemd. Para descobrir qual serviço seu sistema está usando, execute algo como

systemctl list-unit-files | grep -E 'ntp|timesyncd'

Para o TechJS em 16.04, o serviço foi ntp. Para mim no Ubuntu 18.04 (Mint 19), o serviço é systemd-timesyncd. Curiosamente, eu entrei em um servidor 16.04 que eu tenho e ele usa systemd-timesyncdtambém.

Aaron Chamberlain
fonte
Obrigado. Já faz muito tempo desde a publicação da pergunta e não tenho um sistema disponível para teste, mas você pode explicar como sua resposta é diferente da @TechJS, especialmente o comando que você propôs é um pouco diferente.
ysap
Ha obrigado. Foi uma resposta para você, mas também para qualquer pessoa que, no futuro, se encontre aqui sem informações mais atualizadas (como eu). Atualizei minha resposta para ser mais específico sobre como eu chego a minha resposta.
Aaron Chamberlain
4

Tente usar a -bopção para aumentar o tempo.

Cry Havok
fonte
2
Ao tentar a partir de linha de comando, recebo a seguinte resposta: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . No entanto, acho que tentei isso antes, rc.localmas não ajudou.
ysap
3
Você precisa parar o serviço ntp primeiro antes de poder executarntpdate -b <ipaddress>
Wim Deblauwe
2

Bem,

Estou executando um raspbian (debian wheezy) no meu raspberry pi, que não possui o hwclock. Achei útil escrever um pequeno script e executá-lo depois que minha interface da Internet estiver ativa, para ter certeza de que, no momento em que a rede estiver disponível, o relógio será atualizado.

Primeiro verifique se você possui o ntpdatepacote executando

sudo apt-get update
sudo apt-get install ntpdate

Você precisa adicionar o seguinte ao seu /etc/network/interfaces(certamente eth0aqui está apenas um exemplo):

auto eth0
    iface eth0 inet dhcp
    post-up /usr/local/sbin/update-time.sh

E crie o seguinte script em /usr/local/sbin/update-time.sh(não se esqueça de torná-lo executável por chmod):

#!/bin/bash
# This script checks if the ntp process is running, stops it, updates the system time, starts it again

ps cax | grep -c ntpd > /dev/null
onoff=$?
if [ "$onoff" -gt 0 ]; then
    echo "stopping ntpd..."
    service ntp stop
    echo "ntpd stopped"
else
    echo "ntpd not running, ready to update the date"
fi


isinstalled=$(dpkg-query -l | grep -c ntpdate)
if [ "$isinstalled" -gt 0 ]; then
    ntpdate -t 3 -s ntp4.stratum2.ru
    echo "date and time update executed"
else
    echo "ntpdate package not installed, can't update using ntp"
fi

echo "restarting ntpd..."
service ntp start 
echo "ntpd running"
echo "printing current date and time:"
date

exit
art.shutter
fonte
1

Os algoritmos ntpd descartam os desvios de amostra que excedem 128 ms, a menos que o intervalo durante o qual nenhum deslocamento de [valor absoluto de] seja menor que 128 ms exceda 900s. A primeira amostra depois disso, independentemente do deslocamento, avança o relógio para a hora indicada. Na prática, isso reduz a taxa de falsos alarmes em que o relógio é pisado com erro para uma incidência extremamente baixa.

Normalmente, o ntpd sai se o deslocamento exceder o limite de sanidade, que é 1000 s por padrão. Isso pode ser desativado com a opção -g:

-g Normalmente, o ntpd sai se o deslocamento exceder o limite de sanidade, que é 1000 s por padrão. Se o limite de sanidade estiver definido como zero, nenhuma verificação de sanidade será realizada e qualquer deslocamento será aceitável. Esta opção substitui o limite e permite que o tempo seja definido como qualquer valor sem restrição; no entanto, isso pode acontecer apenas uma vez. Depois disso, o ntpd será fechado se o limite for excedido. Esta opção pode ser usada com a opção -q.

ambos em http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale

Jonathzen
fonte
1

Se você puder dispor de tempo para aguardar o tempo que leva para o sistema ser sincronizado, use o ntp-waitcomando:

ntp-wait || exit -1 
# i believe this would exit the script if it fails, but not sure of ntp-wait return codes, learn this first.

echo Time is synced, go ahead with backup
tar
rsync etc.
Anônimo
fonte
1

Se você estiver no systemd, poderá usar este comando:

sudo systemctl restart ntp
# or
sudo systemctl restart ntp.service

E então o tempo é atualizado dentro de 10 a 15 segundos.
Testado no ubuntu mate 16.04

AmirHossein
fonte
0

ntpde ntpdateexecute por padrão usando uma porta restrita (UDP 123). Se você estiver protegido por um firewall, ntpdnunca funcionará, mas ntpdatepoderá funcionar com a -uopção Por exemplo: ntpdate -u 0.ubuntu.pool.ntp.org ou ntpdate -u time.nist.govambos devem funcionar bem.

GN DeSouza
fonte