¿Cómo forzar una actualización de reloj usando ntp?

321

Estoy ejecutando Ubuntu en un sistema integrado basado en ARM que carece de un RTC respaldado por batería. La hora de despertar es en algún lugar durante 1970. Por lo tanto, uso el servicio NTP para actualizar la hora a la hora actual.

Agregué la siguiente línea al archivo /etc/rc.local :

sudo ntpdate -s time.nist.gov

Sin embargo, después del inicio, todavía demora un par de minutos hasta que se actualice la hora, período durante el cual no puedo trabajar de manera efectiva con tar y make .

¿Cómo puedo forzar una actualización de reloj en un momento dado?

ACTUALIZACIÓN 1: Lo siguiente (gracias a Eric y Stephan) funciona bien desde la línea de comandos, pero no actualiza el reloj cuando se pone en /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

¿Qué estoy haciendo mal?

ACTUALIZACIÓN 2: Intenté seguir las pocas sugerencias que surgieron en respuesta a la primera actualización, pero parece que nada realmente hace el trabajo como se requiere. Esto es lo que intenté:

  1. Reemplace el servidor a us.pool.ntp.org
  2. Usar rutas explícitas para los programas
  3. Elimina el servicio ntp y deja solo sudo ntpdate ... en rc.local
  4. Elimina el sudo del comando anterior en rc.local

Utilizando lo anterior, la máquina aún comienza en 1970. Sin embargo, cuando se hace desde la línea de comandos una vez que se inicia sesión (a través de ssh ), el reloj se actualiza tan pronto como invoco ntpdate .

Lo último que hice fue eliminar eso de rc.local y realizar una llamada a ntpdate en mi archivo .bashrc . Esto actualiza el reloj como se esperaba y obtengo la hora actual verdadera una vez que el símbolo del sistema está disponible.

Sin embargo , esto significa que si la máquina está encendida y ningún usuario está conectado, entonces la hora nunca recibe actualizaciones. Por supuesto, puedo volver a instalar el servicio ntp , por lo que al menos el reloj se actualiza en unos minutos desde el inicio, pero luego volvemos al cuadrado 1.

Entonces, ¿hay alguna razón por la que colocar el comando ntpdate en rc.local no realice la tarea requerida, mientras que hacerlo en .bashrc funciona bien?

    
pregunta ysap 13.02.2013 - 22:58

15 respuestas

282

Probablemente el servicio ntp se está ejecutando, es por eso que ntpdate no puede abrir el socket (puerto 123 UDP) y conectarse al servidor ntp.

Pruebe desde la línea de comandos:

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

Si quiere poner esto en /etc/rc.local , use lo siguiente:

( /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 )&
    
respondido por el Eric Carvalho 14.02.2013 - 00:13
425

En lugar de ntpdate (que es en desuso ), use

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

El -gq le dice al daemon ntp que corrija el tiempo independientemente del desplazamiento ( g ) y sale inmediatamente ( q ) después de configurar el tiempo.

    
respondido por el Martin Schröder 14.02.2013 - 13:32
49

Use sntp para establecer la hora inmediatamente. Por ejemplo:

sudo sntp -s 24.56.178.140

Los números después de -s pueden ser cualquier servidor de tiempo ntp, ese es NIST en Ft. Collins, Colorado.

    
respondido por el Guest 08.11.2013 - 02:00
37

Como otros han señalado, la mejor solución es ordenar a ntpd que ignore el umbral de pánico, que es 1000 segundos por defecto. Puede configurar el umbral de emergencia de una de estas dos maneras:

  • edite /etc/default/ntp y asegúrese de que la opción -g esté presente.
  • edite /etc/ntp.conf y coloque tinker panic 0 en la parte superior

Hasta ahora, esto es esencialmente lo que otros han recomendado, pero hay un paso más que creo que deberían tomar. Instale el 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.

Con fake-hwclock instalado, su máquina no comenzará a funcionar pensando que ya es 1970. Cuando la máquina se inicie, configurará su reloj en la marca de tiempo que fake-hwclock escribió durante el último reinicio / apagado. Esto significa que puede tener un reloj un tanto correcto en caso de que haya problemas de red cuando arranque.

    
respondido por el dfc 04.04.2014 - 00:11
12

ntpdate es un programa diferente de la red dameon. Es probable que NTPDate esté erroneando al arrancar porque ntpd se está ejecutando en ese socket.

Desde la línea de comandos, ejecuta

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

También puede desinstalar ntpd todos juntos (apt-get remove ntp) y agregar un script cron para usar ntpdate cada hora más o menos.

ACTUALIZAR

El servicio ntp probablemente no tenga un valor significativo para usted en este sistema, por lo tanto, elimínelo primero.

# sudo apt-get remove ntp

Ahora agregue el comando:

ntpdate -sb time.nist.gov

a /etc/rclocal

Reiniciar Debería ser bueno en ese punto.

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

si todo lo que quiere hacer es configurar el reloj una vez, simple

    
respondido por el batflaps 26.02.2015 - 23:57
7

La forma correcta de hacer esto en un sistema Debian / Mint / Ubuntu (u otro derivado de Debian) es tener la línea

NTPD_OPTS="-g"

en el archivo

/etc/default/ntp

Esto garantiza que cuando ntpd se inicie desde el script /etc/init.d/ntp, se ejecute con la opción "-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 ntpd corrija la hora del sistema cuando está a más de 1000 s, por ejemplo, cuando la hora del sistema es el 1 de enero de 1970 en el arranque porque no hay hardware RTC.

    
respondido por el J G Miller 03.04.2014 - 13:20
4

Pruebe usar la opción -b para aumentar el tiempo.

    
respondido por el Cry Havok 13.02.2013 - 23:18
4

tlsdate configura el reloj local conectándose de forma segura con TLS a servidores remotos y extrayendo el tiempo de espera remoto del apretón de manos seguro . diferente a ntpdate , tlsdate usa TCP, por ejemplo, conexión a un HTTPS remoto o TLS  servicio habilitado, y proporciona cierta protección contra los adversarios que intentan  darle información sobre el tiempo malicioso.

$ tlsdate -V -n -H encrypted.google.com
    
respondido por el Kokizzu 23.02.2016 - 12:52
2

enlace

usa timedatectl para establecer la hora, ntp está en desuso.

    
respondido por el xiaoyifang 29.11.2016 - 09:57
1

Los algoritmos ntpd descartan desplazamientos de muestra superiores a 128 ms, a menos que el intervalo durante el cual ningún [valor absoluto de] desplazamiento de muestra sea inferior a 128 ms exceda los 900s. La primera muestra después de eso, sin importar el desplazamiento, pasa el reloj al tiempo indicado. En la práctica, esto reduce la tasa de falsas alarmas cuando el reloj se interrumpe por error a una incidencia muy baja.

Normalmente, ntpd sale si el desplazamiento excede el límite de cordura, que es 1000 s por defecto. Esto se puede desactivar con la opción -g:

-g     Normalmente, ntpd sale si el desplazamiento excede el límite de cordura, que es 1000 s por defecto. Si el límite de cordura se establece en cero, no se realiza ninguna comprobación de cordura y cualquier compensación es aceptable. Esta opción anula el límite y permite que el tiempo se establezca en cualquier valor sin restricción; sin embargo, esto puede suceder solo una vez. Después de eso, ntpd saldrá si se excede el límite. Esta opción se puede usar con la opción -q.

ambos de enlace

-Jonathan Natale

    
respondido por el Jonathzen 28.01.2015 - 22:26
1

Bueno,

Estoy ejecutando un raspbian (debian wheezy) en mi raspberry pi, que no tiene el hwclock. Me resultó útil escribir un pequeño script y ejecutarlo después de que mi interfaz de Internet esté activa, de modo que estoy seguro de que en el momento en que la red esté disponible, el reloj se actualizará.

Primero comprueba que tienes el paquete ntpdate ejecutando

sudo apt-get update
sudo apt-get install ntpdate

Debes agregar lo siguiente en tu /etc/network/interfaces (seguramente eth0 aquí es solo un ejemplo):

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

Y crea el siguiente script en /usr/local/sbin/update-time.sh (no olvides hacerlo ejecutable 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
    
respondido por el art.shutter 12.12.2015 - 16:14
0

ntpd y ntpdate se ejecutan de forma predeterminada utilizando un puerto restringido (UDP 123). Si está detrás de un firewall, ntpd nunca funcionará, pero ntpdate puede funcionar con la opción -u . Por ejemplo: ntpdate -u 0.ubuntu.pool.ntp.org o ntpdate -u time.nist.gov deberían funcionar bien.

    
respondido por el G. N. DeSouza 05.06.2015 - 01:01
0

Si puede permitirse el tiempo de esperar el tiempo que sea necesario antes de que su sistema se sincronice, puede usar el 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.
    
respondido por el Anonymous 08.12.2015 - 08:55
0

Si está en systemd puede usar este comando:

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

Y luego el tiempo se actualiza dentro de 10-15 segundos.
Probado en ubuntu mate 16.04

    
respondido por el TechJS 21.02.2018 - 19:01

Lea otras preguntas en las etiquetas