Come verificare se NTPD aggiorna correttamente l'ora della macchina usando la shell?


21

Sto cercando di utilizzare NTPD per aggiornare l'ora della mia macchina Linux su un server NTP specificato.
Ecco lo scenario:

Ogni volta che si avvia la macchina Linux, voglio aggiornare l'ora dal server NTP e, se non ha esito positivo, voglio riprovare ogni 5 minuti fino al completamento (massimo 2 ore).

Ho cercato in giro e ho scoperto che dovrei (?) Usare NTPD e usare alcuni comandi come:

#ntpdate ntp.server.com (prima di avviare NTPD)
#ntpd some_options_to_start

Le domande sono:

  1. Come posso sapere se l'ora è stata aggiornata con successo da questi comandi?
  2. Posso impostare l'intervallo per l'aggiornamento del tempo da ntpd? (o devo usare qualcosa di simile sleepe loop con do.. while/ forin shell?)

Nota che voglio eseguire i comandi sopra in uno script di shell e inserirò la shell in un web server. Quindi i client (con un browser Web) eseguiranno lo script sul sito Web. Quindi ho bisogno di verificare se l'aggiornamento è andato a buon fine o di non inviare i risultati al client (sul Web).

Risposte:


22

L'uso di uno script per il monitoraggio ntpdnon è comunemente fatto. Solitamente uno strumento di monitoraggio simile nagioso muninutilizzato per monitorare il demone. Lo strumento può inviarti un avviso quando le cose vanno male. Mi munininvio un'email se l'offset supera i 15 millisecondi.

Normalmente, dovresti usare un numero dispari di server in modo che il demone possa eseguire un'elezione tra i server se uno si spegne. Tre sono di solito adeguati e più di cinque sono eccessivi. I client sulla tua rete interna dovrebbero essere in grado di cavarsela con un server interno se lo controlli. Utilizzare server legittimi o server NTP o DNS dei propri ISP come sorgenti di clock. Esistono pool pubblici e server pubblici.

ntpdè auto-tuning e non dovresti aver bisogno di regolarlo una volta configurato e avviato. Con le ntpdimplementazioni recenti è possibile interrompere completamente l'utilizzo ntpdatecome possono fare l'impostazione iniziale della data.

Il seguente script analizzerà gli offset nell'output di ntpd e segnalerà un offset eccessivo. È possibile eseguirlo da cron per inviarti un'e-mail in caso di problemi. Per impostazione predefinita, lo script avvisa con un offset di 0,1 secondi.

#!/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

Questa è la prima istanza che ho sentito di qualcuno che controlla l'ora del sistema. Risposta eccellente.
Bruce Ediger,

@BillTHor: ottima risposta. Molte grazie. Proverò ad applicarlo al mio lavoro attuale
vede il

@BruceEdiger Suppongo che tu non abbia mai sentito parlare della gente nella mailing list time-nut.
dfc,

Per quanto riguarda "L'uso di uno script per monitorare ntpd non è comunemente fatto" va bene; la directory degli script all'interno del tarball ntp punta alla conclusione opposta.
dfc,

@dvc Gli script non sembrano includere la funzionalità richiesta. Sembra che ci sia del codice per generare trap SNMP, ma non ho riscontrato SNMP per monitorare NTP. Ho dovuto fare il mio monitoraggio in diverse grandi organizzazioni.
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
Su Ubuntu 16.04, ho trovato ntpstat buggy. Dopo aver scollegato il mio cavo di rete, era ancora mostrato come sincronizzato con lo stato di ritorno 0, sebbene ntpq -pnon mostrasse alcun peer. Quindi non mi fido di questa utility.
Huygens,

8

Per rispondere alla prima domanda, di ntpdatesolito ti dice cosa ha fatto o forse non ha fatto.

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

Il demone NTP, ntpdviene eseguito costantemente e chiede i server NTP (di solito configurati in /etc/ntp.conf) per l'ora ogni tanto. Non dovresti eseguire lo script ogni 5 minuti. ntpdatedovrebbe portare la macchina quasi sincronizzata con il server e ntpdverrà eseguita in background e mantenuta sincronizzata. Non si imposta l'intervallo che ntpd tenta, regola l'intervallo in base al modo in cui percepisce le deviazioni dell'orologio locale dai server e alla qualità delle connessioni ai server.

Puoi usare un programma chiamato ntpdcper vedere cosa ntpdconserva come informazione:

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>

Penso che il numero che in genere ti interessa sia "offset", ovvero il numero di secondi in cui l'orologio locale è spento dall'orologio del server.

Come manpagina per gli ntpdcstati per il comando "peer":

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

Quindi, chiaramente, l '"offset" è in secondi.

Sembra che ntpdcè deprecato, sostituito da ntpq. ntpqha un comando interattivo "peer", che fornisce "offset" in millisecondi. Il mio server Redhat ha entrambi ntpdce ntpq, quindi dovrai stare attento.


Grande! Ma c'è una parte poco chiara nella mia domanda. Eseguirò uno script di shell in un programma C. E volevo controllare il valore di ritorno (forse userò la funzione di sistema ("shellscript")). La tua risposta mi dà l'idea che non dovremmo impostare l'intervallo per NTPD e nel caso, voglio cambiare il server NTP, devo modificare il file ntp.conf. Potresti dirmi come funziona ntpd con il server ntp. Devo riavviare il demone ntpd dopo aver modificato il file ntp.conf (usando di nuovo lo shell script )
vede il

ntpd è un processo daemon - funziona continuamente. Decide quante volte chiedere a un server l'ora corrente, e quanto spesso e quanto cambiare l'orologio locale, in base a come l'orologio locale si sposta: non si può davvero controllare nessuno degli intervalli. ntpd viene eseguito in background. Per modificare un server NTP, modificare /etc/ntp.conf, quindi interrompere e avviare ntpd.
Bruce Ediger,

Dovrei anche menzionare che il frammento di codice che hai pubblicato dovrebbe essere eseguito al runlevel 3 o sopra durante l'avvio. ntpdate imposta l'orologio di sistema, quindi ntpd diventa un processo daemon e mantiene l'orologio sincronizzato con i server. Di solito, non si eseguono quelle 2 righe di codice per "impostare l'orologio".
Bruce Ediger,

Capito. Che ne dici di ntpdate quando ottiene un ntpserver sbagliato (per esempio) e non funziona correttamente? Come posso conoscerlo dagli script della shell?
vede il

7

ntp-wait è stato creato per questo problema.

Cinque minuti con man ntp-waite dovresti essere attivo e funzionante ...


Ho trovato ntp-wait in debian, ma non in centos. per favore aiuto !
Massimo,

2

Ho aggiunto allo script bash @BillTHor anche un controllo per il codice di uscita 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

[AGGIORNAMENTO] poiché lo script che utilizzava l'output di ntpq non era utile per l'offset di grandi dimensioni (più di 4 cifre dell'offset) ho provato una nuova versione 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

L'offset NTP può essere ottenuto con la seguente pipeline UNIX:

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

Il conteggio peer NTP può essere ottenuto con la seguente pipeline UNIX:

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

Per l' offset NTP utilizziamo:

  • avviso> 250 ms
  • critico> 500ms

Per il conteggio dei peer NTP utilizziamo:

  • nessuna soglia di avviso
  • critico <1

Configurazione di monitoraggio NTP pronta per Zabbix (fonte: 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 '^\*|^\+'

Plugin di monitoraggio NTP pronti per 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

Dovrei davvero lasciare che l'avviso e le soglie critiche negli script Nagios siano configurabili con -w e -c. Non sono davvero completamente pronti per il plugin senza questo. Ulteriori indicazioni su questo in un tutorial qui: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Si presume che Chrony gestisca il proprio caso d'uso meglio di NTPd (accensione e spegnimento della rete e della macchina, sospensione, ecc.). Vedere

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

RE perché penso che Chronny sia buono: è stato preinstallato sulla mia macchina fedora e non ho mai avuto problemi con esso (lo uso da anni ormai). Non ho mai avuto problemi con ntpd anche in passato, ma se leggi sul link che ho fornito, ci sono alcune informazioni sul perché chrony è meglio per macchine non sempre su macchine. Ecco perché ho suggerito all'op di provarlo, potrebbe o meno funzionare meglio per lui. Quindi è solo un'altra buona opzione da provare prima di entrare in troppe ottimizzazioni, ottimizzazioni e hacking di ntpd.


1
per favore, commenta se declassate con il vostro razionale
Akostadinov il

Perché pensi che Chrony sia migliore?
dfc,

@dfc, è stato preinstallato sulla mia macchina fedora e non ho mai avuto problemi con esso (lo uso da anni ormai). Non ho mai avuto problemi con ntpd in passato, ma se leggi sul link che ho fornito, ci sono alcune informazioni sul perché chrony è meglio per le macchine non sempre. Ecco perché ho suggerito all'op di provarlo, potrebbe o meno funzionare meglio per lui. Quindi è solo un'altra buona opzione da provare prima di entrare in troppe ottimizzazioni, ottimizzazioni e hacking di ntpd.
Akostadinov,

Piuttosto aggiungi queste informazioni sulla risposta stessa. È abbastanza prezioso e potresti semplicemente invertire il voto.
Tshepang,

Dato che la tua risposta non corrisponde alla domanda reale, secondo me è più adatto per essere un commento sulla domanda.
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

Come la precedente risposta precedente, ma con una leggera modifica come il comando precedente eseguirà l'istruzione if per altrettanti offset, ovvero se offset è 3, verrà stampato NTP entro 0,1 .... 3 volte prima della chiusura. Potrebbe essere fastidioso se si dispone di un server che è molto lontano dalla sincronizzazione. C'è probabilmente un modo per rimuovere anche il ciclo for ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.