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

313

Estou executando o Ubuntu em um sistema embarcado baseado em ARM que não possui um RTC suportado por bateria. O horário de despertar está em algum lugar durante 1970. Assim, eu uso o serviço NTP para atualizar o horário atual.

Eu adicionei a seguinte linha ao arquivo /etc/rc.local :

sudo ntpdate -s time.nist.gov

No entanto, após a inicialização, ainda leva alguns minutos até que a hora seja atualizada, período durante o qual não posso trabalhar com tar e make .

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

UPDATE 1: O seguinte (graças a Eric e Stephan) funciona bem na linha de comando, mas não atualiza o relógio quando colocado em /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 de errado?

UPDATE 2: Eu tentei seguir as poucas sugestões que vieram em resposta à primeira atualização, mas nada parece realmente fazer o trabalho conforme necessário. Aqui está o que eu tentei:

  1. Substitua o servidor por us.pool.ntp.org
  2. Use caminhos explícitos para os programas
  3. Remova o serviço ntp e deixe apenas sudo ntpdate ... em rc.local
  4. Remova o sudo do comando acima em rc.local

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

A última coisa que fiz foi remover isso de rc.local e fazer uma chamada para ntpdate no meu arquivo .bashrc . Isso atualiza o relógio conforme o esperado, e eu recebo a verdadeira hora atual assim que o prompt de comando estiver disponível.

No entanto , isso significa que, se a máquina estiver ligada e nenhum usuário estiver logado, a hora nunca receberá atualizações. É claro que posso reinstalar o serviço ntp , de modo que, pelo menos, o relógio seja atualizado em poucos minutos após a inicialização, mas voltamos ao ponto 1.

Portanto, há uma razão pela qual colocar o comando ntpdate em rc.local não executa a tarefa necessária, enquanto isso em .bashrc funciona bem?

    
por ysap 13.02.2013 / 22:58

15 respostas

274

Provavelmente, o serviço ntp está em execução, é por isso que ntpdate não pode abrir o soquete (porta 123 UDP) e se conectar ao servidor ntp.

Experimente na linha de comando:

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

Se você quiser colocar isso em /etc/rc.local , use 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 )&
    
por Eric Carvalho 14.02.2013 / 00:13
407

Em vez de ntpdate (que é depreciado ), use

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

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

    
por Martin Schröder 14.02.2013 / 13:32
49

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 tempo ntp, esse é o NIST em Ft. Collins, Colorado.

    
por Guest 08.11.2013 / 02:00
37

Como outros 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 duas maneiras:

  • edite /etc/default/ntp e assegure-se de que a opção -g esteja presente.
  • edite o /etc/ntp.conf e coloque tinker panic 0 no topo

Até agora, isso é essencialmente o que outros recomendaram, mas há mais um passo que eu acho que você deveria dar. Instale o programa de hwclock falso:

# 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 hwclock falso instalado, sua máquina não iniciará, pensando que é 1970 novamente. Quando a sua máquina inicializa, ela ajustará seu relógio para o timestamp fake-hwclock escrito 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.

    
por dfc 04.04.2014 / 00:11
11

O ntpdate é um programa diferente do net dameon. É provável que o NTPDate esteja errando na inicialização porque o ntpd está sendo executado nesse soquete.

Na linha de comando, 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 cron script para usar o ntpdate a cada hora, aproximadamente.

UPDATE

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.

    
por Stephan 14.02.2013 / 00:07
8
rdate -s tick.greyware.com

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

    
por batflaps 26.02.2015 / 23:57
6

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 estiver a mais de 1000 s, por exemplo, quando a hora do sistema é 1 de janeiro de 1970 na inicialização porque não há RTC de hardware.

    
por J G Miller 03.04.2014 / 13:20
4

Tente usar a opção -b para aumentar o tempo.

    
por Cry Havok 13.02.2013 / 23:18
3

tlsdate define o relógio local conectando-se com TLS ao remoto  servidores e extrair o tempo remoto do handshake seguro. Ao contrário  ntpdate, o tlsdate usa o TCP, por exemplo, conectando-se a um HTTPS ou TLS remoto  serviço habilitado e fornece alguma proteção contra os adversários que tentam  fornecer informações maliciosas sobre o tempo.

tlsdate -V -n -H encrypted.google.com

    
por Kokizzu 23.02.2016 / 12:52
2

link

use timedatectl para definir a hora O ntp está obsoleto.

    
por xiaoyifang 29.11.2016 / 09:57
1

Os algoritmos ntpd descartam deslocamentos de amostra que excedem 128 ms, a menos que o intervalo durante o qual nenhum [valor absoluto de] deslocamento de amostra seja menor que 128 ms exceda 900s. A primeira amostra depois disso, não importa o deslocamento, avança o relógio para a hora indicada. Na prática, isso reduz a taxa de falsos alarmes, quando 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 é definido como zero, nenhuma verificação de sanidade é executada e qualquer desvio é aceitável. Esta opção sobrescreve o limite e permite que o tempo seja definido para qualquer valor sem restrição; no entanto, isso pode acontecer apenas uma vez. Depois disso, o ntpd sairá se o limite for excedido. Esta opção pode ser usada com a opção -q.

ambos do link

-Jonathan Natale

    
por Jonathzen 28.01.2015 / 22:26
1

Bem,

Estou executando um raspbian (debian wheezy) no meu pi de framboesa, que não tem o hwclock. Achei útil escrever um pequeno script e executá-lo depois que minha interface de internet está ativa, de modo que estou certo de que no momento em que a rede estiver disponível, o relógio será atualizado.

Primeiro, verifique se você tem o pacote ntpdate executando

sudo apt-get update
sudo apt-get install ntpdate

Você precisa adicionar o seguinte ao seu /etc/network/interfaces (certamente eth0 aqui é 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 em 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
    
por art.shutter 12.12.2015 / 16:14
0

ntpd e ntpdate são executados por padrão usando uma porta restrita (UDP 123). Se você estiver protegido por um firewall, ntpd nunca funcionará, mas ntpdate poderá trabalhar com a opção -u . Por exemplo: ntpdate -u 0.ubuntu.pool.ntp.org ou ntpdate -u time.nist.gov devem funcionar bem.

    
por G. N. DeSouza 05.06.2015 / 01:01
0

Se você puder ter tempo para esperar o tempo que for necessário antes que o sistema fique sincronizado, você poderá usar o comando ntp-wait :

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.
    
por Anonymous 08.12.2015 / 08:55
0

Se você está no systemd, você pode usar este comando:

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

E a hora é atualizada em cerca de 10 a 15 segundos.
Testado no Ubuntu Mate 16.04

    
por TechJS 21.02.2018 / 19:01

Tags