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

377

Estoy ejecutando Ubuntu en un sistema integrado basado en ARM que carece de un RTC respaldado por batería. La hora de despertarse 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 /etc/rc.localarchivo:

sudo ntpdate -s time.nist.gov

Sin embargo, después del inicio, todavía toma un par de minutos hasta que se actualice el tiempo, durante el cual no puedo trabajar de manera efectiva con tary 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 puede actualizar el reloj cuando se coloca /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 nada parece hacer el trabajo según lo requerido. Esto es lo que probé:

  1. Reemplace el servidor para us.pool.ntp.org
  2. Utilice rutas explícitas a los programas.
  3. Eliminar el ntpservicio por completo y dejarlo solo sudo ntpdate ...enrc.local
  4. Eliminar el sudodel comando anterior enrc.local

Usando lo anterior, la máquina todavía comienza en 1970. Sin embargo, cuando se hace esto desde la línea de comando una vez que se inicia sesión (vía ssh), el reloj se actualiza tan pronto como invoco ntpdate.

Lo último que hice fue eliminar eso rc.localy hacer una llamada a ntpdatemi .bashrcarchivo. Esto actualiza el reloj como se esperaba, y obtengo la hora actual real 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 ha iniciado sesión, entonces el tiempo nunca recibe actualizaciones. Por supuesto, puedo reinstalar el ntpservicio para que al menos el reloj se actualice a los pocos minutos del inicio, pero luego volvemos al punto 1.

Entonces, ¿hay alguna razón por la que colocar el ntpdatecomando rc.localno realice la tarea requerida, mientras que hacerlo .bashrcfunciona bien?

ysap
fuente
2
de [aquí] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615
44
observe la bandera '-b' en ntpdate. Desde la página de manual de ntpdate: "Fuerce el tiempo que debe pasar usando la llamada al sistema settimeofday (), en lugar de desplazarse (predeterminado) usando la llamada al sistema adjtime (). Esta opción debe usarse cuando se llama desde un archivo de inicio en el momento del arranque". Muchas de las respuestas a continuación no lo incluyen, y eso puede ser parte del problema para que las cosas funcionen. Tenga en cuenta que el indicador '-B' que menciona que las compensaciones de más de 128 ms pueden tardar horas en sincronizarse utilizando el mecanismo predeterminado 'slew'
Matt S.
No hay necesidad de usar sudoen los archivos /etc/rc.locale ... ya se ejecutan como root.
Soren A
timedatectl, pero askubuntu.com/questions/832646/…
nobar

Respuestas:

325

Probablemente el ntpservicio se esté ejecutando, por eso ntpdateno se puede abrir el socket (puerto 123 UDP) y conectarse al servidor ntp.

Probar desde la línea de comando:

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

Si desea poner esto en /etc/rc.localuso 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 )&
Eric Carvalho
fuente
Gracias. ¿Puede explicar por qué necesita las rutas explícitas?
ysap
1
Realmente no lo se. :-) Tuve problemas una vez tratando de ejecutar servicedesde rc.local y cron pero logré solucionarlo usando /etc/init.d/xxx en su lugar. En realidad, creo que no tiene que dar la ruta completa ntpdate, me gusta usar rutas completas en los scripts solo para asegurarme de que se encuentre el archivo correcto.
Eric Carvalho
2
OK, aparentemente este era el problema. Ahora el reloj se actualiza tan pronto como se establece la conexión de red. Gracias.
ysap
3
Descubrí que us.pool.ntp.orges más sensible.
ysap
77
Con la -uopción, no necesita detener el servicio ntp:sudo ntpdate -u time.nist.gov
Edward Anderson el
486

En lugar de ntpdate (que está en desuso ), use

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

El -gqle dice al demonio ntp que corrija la hora independientemente del desplazamiento ( g) y salga inmediatamente ( q) después de configurar la hora.

Martin Schröder
fuente
3
Gracias. Todavía se muestra 1970 después de este comando (w / sudo). Al leer la página de ntpdmanual, no estoy seguro de cómo esto obliga a una actualización.
ysap
12
La opción "-q" le dice al demonio NTP que se inicie, configure la hora y salga inmediatamente. La opción "-g" le permite corregir diferencias de tiempo mayores de 1000 segundos. Para un plazo más largo, simplemente debe configurar el demonio NTP para que se ejecute siempre.
tgharold
35
Esta respuesta debería ir al principio, porque es correcta: ntpdate está en desuso e instalarlo es una mala idea, ya que entra en conflicto con ntp. Si el reloj no funciona, debe realizar este paso manual porque, de lo contrario, ntp no cambiará su reloj y no le dirá por qué.
Liam
31
Para mí, sudo ntpd -gqno sale! Estoy en 14.10 y tengo que CTRL + C para continuar ... ¿o cuánto tiempo se supone que debe tomar?
Yanick Rochon
55
Para su información, en mi sistema (CentOS 6.6), necesitaba cambiar las dos instancias de sudo service ntp...a sudo service ntpd....
rinogo
63

Use sntp para configurar la hora de inmediato. Por ejemplo:

sudo sntp -s 24.56.178.140

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

Huésped
fuente
1
¡Eso funciono! +1
CappY
77
Esto funcionó cuando "sudo ntpd -gq" no lo hizo.
Matt White
No sé cuántas veces he venido buscando esta respuesta. Funciona todo el tiempo.
Caos
1
incapaz de localizar el paquete sntp?
templo
1
apt-get install sntp / yum install sntp (sí, también funciona en CentOS, RedHat, fedore)
ndemou
40

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

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

Hasta ahora, esto es esencialmente lo que otros han recomendado, sin embargo, hay un paso más que creo que debería 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 arrancará pensando que es 1970 nuevamente. Cuando su máquina se inicia, configurará su reloj con la marca de tiempo que escribió fake-hwclock durante el último reinicio / apagado. Esto significa que puede tener un reloj algo correcto en caso de que haya problemas de red al arrancar.

dfc
fuente
1
-gparecía no hacer nada por mí (en la línea de comando, no tengo /etc/default/ntp), pero agregando tinker panic 0a ntp.conftrabajado
Dave Cousineau
@Sahuagin No sé qué decirte además de que tienes un paquete ntp no estándar. / etc / default / ntp es parte del paquete de Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist y -g ha sido una opción desde que tengo memoria.
DFC
lo siento, supongo que en realidad no estoy en Ubuntu y debería haber pensado un poco más antes de comentar. tinker panic 0definitivamente parece haber funcionado sin embargo.
Dave Cousineau
13

ntpdate es un programa diferente del net dameon. NTPDate probablemente está produciendo un error al arrancar porque ntpd se está ejecutando en ese socket.

Desde la línea de comando, ejecute

# 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 tendrá un valor significativo para usted en este sistema, así que 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.

Stephan
fuente
respuesta actualizada
Stephan
1
¿No se está eliminando ntpdate o algo así? Además, si entiendo esto correctamente, el servicio se ejecuta y mantiene la sincronización del reloj local con el reloj del servidor, por lo que la deriva está limitada. Si elimina ntp y ejecuta ntpdate una vez, ¿no se verá afectado por la deriva del reloj cuando la máquina esté encendida durante períodos prolongados?
ysap
Stephan, mira la actualización # 2 a la pregunta.
ysap
3
Sí, ntpdate se está eliminando gradualmente. Se prefiere el uso de "ntpd -q" (ambas variantes requieren que ntpd se detenga primero).
tgharold
11

Use timedatectl(unidad de servicio systemd) para configurar la hora. ntpes obsoleto.

sudo systemctl restart systemd-timesyncd.service

Puede verificar la hora se actualizó leyendo los registros con journalctl -xe | tail

Referencia

xiaoyifang
fuente
Esto funcionó en Ubuntu 19.04. ¡Gracias!
Krubo
10
rdate -s tick.greyware.com

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

batflaps
fuente
Gracias. Actualmente no tengo el sistema para verificar este comando, pero si sigues la discusión en la pregunta y la respuesta aceptada, verás que el problema era la falta de disponibilidad de la red al momento de ejecutar el comando de actualización del reloj.
ysap
Esto solucionó un problema de sincronización de tiempo en mi Raspberry Pi. Gracias.
Oliver Spryn
7

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

NTPD_OPTS="-g"

en el archivo

/etc/default/ntp

Esto garantiza que cuando se inicia ntpd desde el script /etc/init.d/ntp, se ejecuta con la opción "-g", a saber

 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 faltan más de 1000 s, por ejemplo, cuando la hora del sistema es el 1 de enero de 1970 al inicio porque no hay RTC de hardware.

JG Miller
fuente
Ya tengo eso, pero todavía dice 3AM en NY, cuando deberían ser las 11pm.
chovy
También ya tenía exactamente esa línea /etc/default/ntp, pero el tiempo no estaba sincronizado.
Dawid Ferenczy Rogožan
5

tlsdateconfigura el reloj local conectándose de forma segura con TLS a servidores remotos y extrayendo el tiempo remoto del protocolo de enlace seguro. A diferencia ntpdate, tlsdateutiliza TCP, por ejemplo, conectarse a un servicio remoto habilitado para HTTPS o TLS, y proporciona cierta protección contra adversarios que intentan proporcionarle información de tiempo maliciosa.

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

Tenga en cuenta que algunos sistemas actuales basados ​​en Ubuntu ni siquiera usan el servicio NTP de forma predeterminada ahora. En mi máquina Linux Mint 19 (Ubuntu 18.04), el tiempo se mantiene systemd-timesyncd.

Entonces, para obtener una hora actualizada después de que haya perdido la sincronización, simplemente ejecuto

sudo systemctl restart systemd-timesyncd

Desde 15.04 Ubuntu usa systemd por defecto. Por lo tanto, los sistemas críticos como el tiempo se administran a través de systemd. Para encontrar qué servicio usa su sistema, ejecute algo como

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

Para TechJS el 16.04 el servicio fue ntp. Para mí en Ubuntu 18.04 (Mint 19) el servicio es systemd-timesyncd. Curiosamente, inicié sesión en un servidor 16.04 que tengo y también lo usa systemd-timesyncd.

Aaron Chamberlain
fuente
Gracias. Ha pasado mucho tiempo desde que publiqué la pregunta, y no tengo un sistema disponible para probar, pero ¿puede explicar cómo es su respuesta diferente de @TechJS, especialmente el comando que propuso es ligeramente diferente.
ysap
Ja gracias. Fue una respuesta para usted, pero también para cualquier persona que en el futuro se encuentre aquí sin más información actualizada (como yo). Actualicé mi respuesta para ser más específico sobre cómo llegar a mi respuesta.
Aaron Chamberlain
4

Intenta usar la -bopción para pasar el tiempo.

Llora Havok
fuente
2
Cuando se trata de la línea de comandos, me da la respuesta siguiente: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Sin embargo, creo que intenté esto antes rc.localpero no sirvió de nada.
ysap
3
Primero debe detener el servicio ntp antes de poder ejecutarntpdate -b <ipaddress>
Wim Deblauwe
2

Bien,

Estoy ejecutando un raspbian (debian wheezy) en mi raspberry pi, que no tiene el hwclock. Me pareció ú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 verifique que tiene el ntpdatepaquete ejecutando

sudo apt-get update
sudo apt-get install ntpdate

Debe agregar lo siguiente en su /etc/network/interfaces(seguramente eth0aquí es solo un ejemplo):

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

Y cree el siguiente script en /usr/local/sbin/update-time.sh(no olvide hacer que sea ejecutable 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
fuente
1

Los algoritmos ntpd descartan compensaciones de muestra que exceden los 128 ms, a menos que el intervalo durante el cual ningún [valor absoluto de] compensación de muestra sea inferior a 128 ms exceda los 900s. La primera muestra después de eso, no importa cuál sea el desplazamiento, pasa el reloj a la hora indicada. En la práctica, esto reduce la tasa de falsas alarmas en las que el reloj avanza por error a una incidencia extremadamente 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 verificación de cordura y cualquier compensación es aceptable. Esta opción anula el límite y permite establecer el tiempo 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 http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale

Jonathzen
fuente
1

Si puede permitirse el tiempo de esperar el tiempo que sea necesario antes de que su sistema se sincronice, puede usar el 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
fuente
1

Si está en systemd, puede usar este comando:

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

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

AmirHossein
fuente
0

ntpdy se ntpdateejecuta por defecto usando un puerto restringido (UDP 123). Si está detrás de un firewall, ntpdnunca funcionará, pero ntpdatepuede funcionar con la -uopción. Por ejemplo: ntpdate -u 0.ubuntu.pool.ntp.org o ntpdate -u time.nist.govambos deberían funcionar bien.

GN DeSouza
fuente