¿Cómo verificar si NTPD actualiza la hora de la máquina con éxito usando shell?


21

Estoy tratando de usar NTPD para actualizar el tiempo de mi máquina Linux a un servidor NTP especificado.
Aquí está el escenario:

Cada vez que se inicia la máquina Linux, quiero actualizar la hora del servidor NTP y, si no tiene éxito, quiero volver a intentarlo cada 5 minutos hasta que tenga éxito (el máximo es de 2 horas).

Busqué y descubrí que debería (?) Usar NTPD y usar algún comando como:

#ntpdate ntp.server.com (antes de comenzar NTPD)
#ntpd some_options_to_start

Las preguntas son:

  1. ¿Cómo puedo saber si el tiempo se actualizó correctamente con estos comandos?
  2. ¿Puedo configurar el intervalo para actualizar el tiempo desde ntpd? (¿o tengo que usar algo así sleepcomo un bucle con do.. while/ foren shell?)

Tenga en cuenta que quiero ejecutar los comandos anteriores en un script de shell y colocaré el shell en un servidor web. Luego, los clientes (con un navegador de navegador web) ejecutarán el script en el sitio web. Por lo tanto, debo verificar si la actualización se realizó correctamente o no para enviar el resultado al cliente (a través de la web).

Respuestas:


22

El uso de un script para monitorear ntpdno se hace comúnmente. Por lo general, una herramienta de monitoreo como nagioso muninse usa para monitorear el demonio. La herramienta puede enviarle una alerta cuando las cosas salen mal. Tengo un munincorreo electrónico si el desplazamiento supera los 15 milisegundos.

Normalmente, debe usar un número impar de servidores para que el demonio pueda realizar una elección entre los servidores si uno se apaga. Tres es generalmente adecuado, y más de cinco es excesivo. Los clientes en su red interna deberían poder funcionar con un servidor interno si lo monitorea. Utilice servidores legítimos o los servidores NTP o DNS de sus ISP como fuentes de reloj. Hay piscinas públicas, así como servidores públicos.

ntpdes autoajustable y no debería necesitar ajustarlo una vez que se configura e inicia. Con ntpdimplementaciones recientes , puede dejar de usarlas por ntpdatecompleto, ya que pueden hacer la configuración inicial de la fecha.

El siguiente script analizará los desplazamientos en la salida de ntpd e informará un desplazamiento excesivo. Puede ejecutarlo desde cron para enviarle un correo electrónico si hay problemas. El guión por defecto es alerta en un desplazamiento de 0.1 segundos.

#!/bin/bash
limit=100   # Set your limit in milliseconds here
offsets=$(ntpq -nc peers | tail -n +3 | cut -c 62-66 | tr -d '-')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${limit:-100} ]; then
        echo "An NTPD offset is excessive - Please investigate"
        exit 1  
    fi  
done
# EOF

Esta es la primera vez que escucho de alguien monitoreando el tiempo del sistema. Excelente respuesta
Bruce Ediger

@BillTHor: Gran respuesta. Muchas gracias. Intentaré aplicarlo a mi trabajo actual
ve el

@BruceEdiger Supongo que nunca has oído hablar de la gente de la lista de correo de Time-Nuts.
DFC

En cuanto a "No se usa comúnmente un script para monitorear ntpd"; el directorio de scripts dentro del ntp tarball apunta a la conclusión opuesta.
DFC

@dvc Los scripts allí no parecen incluir la funcionalidad solicitada. Parece que hay algo de código para generar trampas SNMP, pero no he encontrado SNMP para monitorear NTP. He tenido que hacer mi propio monitoreo en varias organizaciones grandes.
BillThor

8

Usa ntpstat.

myserver # ntpstat
synchronised to NTP server (10.89.160.13) at stratum 4
   time correct to within 124 ms
   polling server every 1024 s

1
En Ubuntu 16.04, encontré ntpstat buggy. Después de desconectar mi cable de red, todavía se mostraba sincronizado con el estado de retorno 0, aunque ntpq -pno mostraba pares. Así que no estoy confiando en esta utilidad.
Huygens

8

Para responder a la primera pregunta, ntpdategeneralmente le dice qué hizo o quizás no hizo.

[root@flask rc.d]# ntpdate dagoo
12 Aug 10:04:03 ntpdate[20585]: adjust time server 10.0.0.15 offset -0.042285 sec

El demonio NTP ntpd, se ejecuta constantemente y solicita a los servidores NTP (generalmente configurados en /etc/ntp.conf) el tiempo cada cierto tiempo. No debería tener que ejecutar su script cada 5 minutos. ntpdatedebería sincronizar la máquina con el servidor, yntpd se ejecutará en segundo plano y la mantendrá sincronizada. No establece el intervalo que ntpd intenta, ajusta el intervalo en función de cómo percibe el reloj local deriva de los servidores y la calidad de las conexiones a los servidores.

Puede usar un programa llamado ntpdcpara ver qué se ntpdguarda como información:

1 % ntpdc 
ntpdc> peers
     remote           local      st poll reach  delay   offset    disp
=======================================================================
*min-time-01.ine 10.0.0.15        1 1024  377 0.07047  0.014673 0.14360
=dns-01.esd189.o 10.0.0.15        2 1024  377 0.07587  0.022277 0.13660
ntpdc>

Creo que el número en el que normalmente tiene interés está "compensado", esa es la cantidad de segundos que su reloj local está apagado del reloj del servidor.

Como la manpágina de ntpdcestados para el comando "pares":

the current estimated delay, offset and dispersion of the peer, all in seconds.

Entonces, claramente, el "desplazamiento" está en segundos.

Parece que ntpdcestá en desuso, reemplazado por ntpq. ntpqtiene un comando interactivo "peers", que da "offset" en milisegundos. Mi servidor Redhat tiene ambos ntpdcy ntpq, por lo tanto, deberá tener cuidado.


¡Excelente! Pero hay una parte poco clara en mi pregunta. Voy a ejecutar un script de shell en un programa en C. Y quería verificar el valor de retorno (tal vez usaré la función del sistema ("shellscript")). Su respuesta me da una idea de que no debemos establecer el intervalo para NTPD y, en caso de que quiera cambiar el servidor NTP, tengo que editar el archivo ntp.conf. ¿Podría decirme cómo funciona ntpd con el servidor ntp? ¿Tengo que reiniciar el demonio ntpd después de editar el archivo ntp.conf (nuevamente usando el script de shell )
Ve el

ntpd es un proceso demonio, se ejecuta continuamente. Decide con qué frecuencia preguntarle a un servidor la hora actual, y con qué frecuencia y cuánto cambiar el reloj local, en función de cómo se desplace el reloj local: realmente no puede controlar ninguno de los intervalos. ntpd se ejecuta en segundo plano. Para cambiar un servidor NTP, edite /etc/ntp.conf, pare y luego inicie ntpd.
Bruce Ediger

También debo mencionar que el fragmento de código que publicaste debe ejecutarse en el nivel de ejecución 3 o superior durante el arranque. ntpdate establece el reloj del sistema, luego ntpd se convierte en un proceso demonio y mantiene el reloj sincronizado con los servidores. Normalmente, no ejecuta esas 2 líneas de código para simplemente "configurar el reloj".
Bruce Ediger

Entiendo. ¿Qué tal ntpdate cuando obtiene el ntpserver incorrecto (por ejemplo) y no funciona correctamente? ¿Cómo puedo saberlo de los scripts de shell?
Ve el

7

ntp-wait fue hecho para este problema.

Cinco minutos con man ntp-waity deberías estar en funcionamiento ...


Encontré ntp-wait en Debian, pero no en centos. por favor ayuda !
Massimo

2

Agregué al script @BillTHor bash también una comprobación para el código de salida ntpdstat> 0:

#!/bin/bash
ntpstat > /dev/null
if [ $? -ne 0 ]; then
        echo "NTPD not synchronized - Please investigate"
        exit 1
fi
limit=1000   # Set your limit in milliseconds here
offsets=$(ntpq -nc peers | tail -n +3 | cut -c 62-66 | tr -d '-')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${limit:-100} ]; then
        echo "An NTPD offset is excessive - Please investigate"
        exit 1
    fi
done
# EOF

[ACTUALIZACIÓN] ya que el script que usaba la salida ntpq no era útil para el desplazamiento de larget (más de 4 dígitos de desplazamiento) Probé una nueva versión usando solo ntpstat:

#!/bin/bash
ntpstat > /dev/null
if [ $? -gt 0 ]; then
        echo "NTPD not synchronized - Please investigate"
        exit 1
fi
limit=1000   # Set your limit in milliseconds here
#offsets=$(ntpq -nc peers | tail -n +3 | cut -c 62-66 | tr -d '-')
#offsets=$(ntpq -nc peers | tail -n +3 | tr -s ' ' | cut -d ' ' -f 9 | tr -d '-' |tr -d '.')
offsets=$(ntpstat | tail -n +2 | head -n 1 | cut -c 27- | tr -d ' ms')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${limit:-100} ]; then
        echo "NTPD offset is excessive: ${offset:-0} [ms] > ${limit:-100} [ms] - Please investigate"
        exit 1
    fi
done
# EOF`enter code here`

2

El desplazamiento de NTP se puede obtener con la siguiente tubería de UNIX:

/usr/sbin/ntpq -pn | /usr/bin/awk 'BEGIN { offset=1000 } $1 ~ /^\*/ { offset=$9 } END { print offset }'

El recuento de pares NTP se puede obtener con la siguiente canalización de UNIX:

/usr/sbin/ntpq -pn | egrep -c '^\*|^\+'

Para ofensas de NTP usamos:

  • advertencia> 250ms
  • crítico> 500 ms

Para el recuento de pares NTP usamos:

  • sin umbral de advertencia
  • crítico <1

Configuración de monitoreo NTP listo para Zabbix (fuente: Joyent):

# NTP
UserParameter=ntp.offset,/usr/sbin/ntpq -pn | /usr/bin/awk 'BEGIN { offset=1000 } $1 ~ /^\*/ { offset=$9 } END { print offset }'
UserParameter=ntp.peers,/usr/sbin/ntpq -pn | egrep -c '^\*|^\+'

Complementos de monitoreo NTP listos para Nagios:

check_ntp_offset:

#!/bin/bash
# thresholds
thresh_warn=250
thresh_crit=500

# metric
ntp_offset=$(/usr/sbin/ntpq -pn | /usr/bin/awk 'BEGIN { offset=1000 } $1 ~ /^\*/ { offset=$9 } END { print offset }')

# Exit codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

if [[ ! "$ntp_offset" =~ ^[0-9]+$ ]] ; then
   # NTP offset could not be read successfully
   echo "NTP OFFSET UNKNOWN - $ntp_offset"
   exit $STATE_UNKNOWN
elif [[ "$ntp_offset" -gt "$thresh_crit" ]] ; then
   # NTP offset is higher than the critical threshold
   echo "NTP OFFSET CRITICAL - ${ntp_offset}ms (> ${thresh_crit}ms)"
   exit $STATE_CRITICAL
elif [[ "$ntp_offset" -gt "$thresh_warn" ]] ; then
   # NTP offset is higher than the warning threshold
   echo "NTP OFFSET WARNING - ${ntp_offset}ms (> ${thresh_warn}ms)"
   exit $STATE_WARNING
else
   # NTP offset is within thresholds
   echo "NTP OFFSET OK - ${ntp_offset}ms (< ${thresh_warn}ms)"
   exit $STATE_OK
fi

check_ntp_peers:

#!/bin/bash
# thresholds
thresh_warn=1
thresh_crit=1

# metric
ntp_peers=$(/usr/sbin/ntpq -pn | egrep -c '^\*|^\+')

# Exit codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

if [[ ! "$ntp_peers" =~ ^[0-9]+$ ]] ; then
   # NTP peers could not be read successfully
   echo "NTP PEERS UNKNOWN - $ntp_peers"
   exit $STATE_UNKNOWN
elif [[ "$ntp_peers" -lt "$thresh_crit" ]] ; then
   # NTP peers is lower than the critical threshold
   echo "NTP PEERS CRITICAL - $ntp_peers (< $thresh_crit)"
   exit $STATE_CRITICAL
elif [[ "$ntp_peers" -lt "$thresh_warn" ]] ; then
   # NTP peers is lower than the warning threshold
   echo "NTP PEERS WARNING - $ntp_peers (< $thresh_warn)"
   exit $STATE_WARNING
else
   # NTP peers is within thresholds
   echo "NTP PEERS OK - $ntp_peers (> $thresh_warn)"
   exit $STATE_OK
fi

Realmente debería permitir que los umbrales críticos y de advertencia en los scripts de Nagios sean configurables con -w y -c. Realmente no están completamente listos para complementos sin eso. Más orientación sobre eso en un tutorial aquí: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Se afirma que Chrony maneja su caso de uso mejor que NTPd (encendido y apagado de la red y la máquina, suspensión, etc.). Ver

http://fedoraproject.org/wiki/Features/ChronyDefaultNTP

RE por qué creo que Chronny es bueno: vino preinstalado en mi máquina fedora y nunca he tenido ningún problema con él (lo he usado durante años). Nunca he tenido problemas con ntpd en el pasado también, pero si lees en el enlace que he proporcionado, hay alguna información sobre por qué Chrony es mejor para no siempre en las máquinas. Por eso le sugerí a la operación que lo probara, puede o no funcionar mejor para él. Por lo tanto, es solo otra buena opción para probar antes de realizar demasiados ajustes, optimizar y piratear ntpd.


1
comente si votó en contra de su racional
akostadinov

¿Por qué crees que Chrony es mejor?
DFC

@dfc, vino preinstalado en mi máquina fedora y nunca he tenido ningún problema con él (lo usé durante años). Nunca he tenido problemas con ntpd en el pasado también, pero si lees en el enlace que he proporcionado, hay alguna información sobre por qué Chrony es mejor para no siempre en las máquinas. Por eso le sugerí a la operación que lo probara, puede o no funcionar mejor para él. Por lo tanto, es solo otra buena opción para probar antes de realizar demasiados ajustes, optimizar y piratear ntpd.
akostadinov

En su lugar, agregue esta información en la propia respuesta. Es lo suficientemente valioso y es posible que invierta el voto.
tshepang

Dado que su respuesta no coincide con la pregunta real, en mi opinión, es más adecuado para hacer un comentario sobre la pregunta.
Jaime Hablutzel

1
#!/bin/bash

limit=100   # Set your limit in milliseconds here

offsets=$(ntpq -nc peers | tail -n +3 | awk '{print $9 }' | tr -d '-')

for offset in ${offsets}; 
do

    if [ ${offset:-0} -ge ${limit:-100} ];
    then
        echo "An NTPD offset is excessive - Please investigate"

        exit 1

    fi  
done

0
#!/usr/bin/bash
#set -x
NTPLIMIT=100   # Set your NTPLIMIT in milliseconds here
offsets=$(ntpq -nc peers | tail -3 | cut -c 62-66 | tr -d '-')
for offset in ${offsets}; do
    if [ ${offset:-0} -ge ${NTPLIMIT:-100} ]; then
        echo "An NTPd offset is excessive Please investigate" exit;
        else
                echo "NTP is within 0.1 second of time server"
                exit;
        fi
done

Igual que la respuesta anterior anterior, pero con una ligera modificación ya que el comando anterior ejecutará la instrucción if para tantas compensaciones, es decir, si el desplazamiento es 3, imprimirá que NTP está dentro de 0.1 .... 3 veces antes del cierre. Podría ser molesto si tiene un servidor que está muy lejos de la sincronización. Probablemente también haya una forma de eliminar el bucle for ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.