Wie überprüfe ich, ob NTPD die Uhrzeit der Maschine mithilfe der Shell erfolgreich aktualisiert?


21

Ich versuche, mithilfe von NTPD die Zeit meines Linux-Computers auf einen bestimmten NTP-Server zu aktualisieren.
Hier ist das Szenario:

Jedes Mal, wenn der Linux-Computer gestartet wird, möchte ich die Zeit vom NTP-Server aktualisieren. Wenn dies nicht erfolgreich ist, möchte ich es alle 5 Minuten erneut versuchen, bis es erfolgreich ist (max. 2 Stunden).

Ich suchte herum und stellte fest, dass ich NTPD verwenden sollte (?) Und einen Befehl wie:

#ntpdate ntp.server.com (vor dem Start von NTPD)
#ntpd some_options_to_start

Die Fragen sind:

  1. Wie kann ich feststellen, ob die Zeit mit diesen Befehlen erfolgreich aktualisiert wurde?
  2. Kann ich das Intervall einstellen, um die Zeit von ntpd zu aktualisieren? (oder muss ich sowas benutzen sleepund mit doloopen .. while/ forin shell?)

Beachten Sie, dass ich die obigen Befehle in einem Shell-Skript ausführen möchte und die Shell auf einem Webserver ablegen möchte. Anschließend führen Clients (mit einem Webbrowser) das Skript auf der Website aus. Ich muss also überprüfen, ob das Update erfolgreich war oder nicht, um das Ergebnis an den Client zu senden (über das Web).

Antworten:


22

Die Verwendung eines Skripts zum Überwachen ntpdist nicht üblich. Normalerweise wird ein Überwachungstool wie nagiosoder muninverwendet, um den Dämon zu überwachen. Das Tool kann Sie benachrichtigen, wenn Probleme auftreten. Ich muss muninmich per E-Mail melden, wenn der Offset 15 Millisekunden überschreitet.

Normalerweise sollten Sie eine ungerade Anzahl von Servern verwenden, damit der Dämon eine Wahl unter den Servern durchführen kann, wenn einer ausfällt. Drei ist in der Regel ausreichend und mehr als fünf ist übermäßig. Clients in Ihrem internen Netzwerk sollten mit einem internen Server auskommen können, wenn Sie ihn überwachen. Verwenden Sie legitime Server oder NTP- oder DNS-Server Ihres Internetdienstanbieters als Taktquellen. Es gibt öffentliche Schwimmbäder sowie öffentliche Server.

ntpdist selbstoptimierend und muss nach der Konfiguration und dem Start nicht angepasst werden. Bei den letzten ntpdImplementierungen können Sie die Verwendung ntpdateganz einstellen, da sie die anfängliche Einstellung des Datums vornehmen können.

Das folgende Skript analysiert die Offsets in der Ausgabe von ntpd und meldet einen übermäßigen Offset. Sie können es von cron ausführen, um sich bei Problemen per E-Mail zu melden. Das Skript warnt standardmäßig mit einem Versatz von 0,1 Sekunden.

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

Dies ist das erste Mal, dass ich von jemandem gehört habe, der die Systemzeit überwacht. Hervorragende Antwort.
Bruce Ediger

@ BillTHor: Tolle Antwort. Vielen Dank. Will versuchen , es zu meiner aktuellen Arbeit anzuwenden
sieht

@BruceEdiger Ich nehme an, Sie haben noch nie von den Leuten auf der Mailing-Liste gehört, die die Zeit verrückt machen.
DFC

Was "Die Verwendung eines Skripts zur Überwachung von ntpd ist nicht üblich" angeht; Das Skriptverzeichnis im NTP-Tarball weist auf das Gegenteil hin.
DFC

@dvc Die Skripte dort scheinen nicht die angeforderte Funktionalität zu enthalten. Es scheint Code zum Generieren von SNMP-Traps zu geben, aber ich habe SNMP zum Überwachen von NTP nicht gefunden. Ich musste in mehreren großen Organisationen mein eigenes Monitoring durchführen.
BillThor

8

Verwenden Sie 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
Unter Ubuntu 16.04 habe ich einen ntpstat-Buggy gefunden. Nachdem ich mein Netzwerkkabel abgezogen hatte, wurde es immer noch als mit dem Rückgabestatus 0 synchronisiert angezeigt, obwohl ntpq -pkeine Peers angezeigt wurden . Ich vertraue diesem Dienstprogramm also nicht.
Huygens

8

Um die erste Frage zu beantworten, ntpdateerfahren Sie normalerweise, was es getan hat oder was es vielleicht nicht getan hat.

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

Der NTP-Dämon wird ntpdständig ausgeführt und fragt von Zeit zu Zeit die NTP-Server (normalerweise in konfiguriert /etc/ntp.conf) ab. Sie sollten Ihr Skript nicht alle 5 Minuten ausführen müssen. ntpdatesollte die Maschine fast mit dem Server synchronisieren und ntpdwird im Hintergrund ausgeführt und synchron gehalten. Sie stellen das Intervall, das ntpd versucht, nicht ein, es passt das Intervall an, das davon abhängt, wie die lokale Uhr von den Servern abweicht, und von der Qualität der Verbindungen zu den Servern.

Sie können ein Programm mit dem Namen verwenden, um ntpdczu sehen, was ntpdals Information erhalten bleibt:

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>

Ich denke, dass die Zahl, an der Sie normalerweise interessiert sind, "Offset" ist, das ist die Anzahl der Sekunden, die Ihre lokale Uhr von der Uhr des Servers abweicht.

Als manSeite für ntpdcStatus für den Befehl "Peers":

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

Somit ist der "Versatz" in Sekunden angegeben.

Es scheint, dass ntpdcveraltet ist, ersetzt durch ntpq. ntpqhat einen interaktiven "Peers" -Befehl, der "Offset" in Millisekunden ausgibt. Mein RedHat-Server verfügt über beides ntpdcund ntpqdaher müssen Sie vorsichtig sein.


Groß! Aber meine Frage enthält einen unklaren Teil. Ich werde ein Shell-Skript in einem C-Programm ausführen. Und wollte den Rückgabewert überprüfen (evtl. benutze ich die Systemfunktion ("shellscript")). Ihre Antwort gibt mir eine Idee, dass wir kein Intervall für NTPD festlegen sollten und für den Fall, dass ich den NTP-Server wechseln möchte, muss ich die Datei ntp.conf bearbeiten. Könnten Sie mir sagen, wie NTPD mit NTP-Server funktioniert. Muss ich zum Neustart ntpd Daemon nach der Bearbeitung ntp.conf Datei (wieder mit Shell - Skript )
sieht

ntpd ist ein Daemon-Prozess, der kontinuierlich ausgeführt wird. Es entscheidet, wie oft ein Server nach der aktuellen Uhrzeit gefragt wird und wie oft und wie stark die lokale Uhr geändert werden muss, je nachdem, wie stark die lokale Uhr abweicht: Sie können keines der Intervalle wirklich steuern. ntpd läuft im Hintergrund. Um einen NTP-Server zu ändern, bearbeiten Sie /etc/ntp.conf und stoppen dann ntpd.
Bruce Ediger

Ich sollte auch erwähnen, dass das von Ihnen gepostete Codefragment während des Bootens auf oder über Runlevel 3 ausgeführt werden sollte. ntpdate stellt die Systemuhr ein, dann wird ntpd zu einem Daemon-Prozess und die Uhr wird mit den Servern synchronisiert. Normalerweise führen Sie diese beiden Codezeilen nicht aus, um nur die Uhrzeit einzustellen.
Bruce Ediger

Ich habe es verstanden. Wie wäre es mit ntpdate, wenn es (zum Beispiel) den falschen ntpserver bekommt und nicht richtig funktioniert? Wie kann ich es anhand von Shell-Skripten erkennen?
sieht

7

ntp-wait wurde für dieses Problem gemacht.

Nach fünf Minuten man ntp-waitsollten Sie einsatzbereit sein ...


Ich habe ntp-wait in debian gefunden, aber nicht in centos. bitte hilf!
Massimo

2

Ich habe dem @ BillTHor-Bash-Skript auch eine Prüfung für den Exit-Code ntpdstat> 0 hinzugefügt:

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

[UPDATE] Da das Skript, das die ntpq-Ausgabe verwendet, für einen größeren Versatz (mehr als 4 Stellen Versatz) unbrauchbar war, habe ich eine neue Version nur mit ntpstat ausprobiert:

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

NTP-Offset kann mit der folgenden UNIX-Pipeline abgerufen werden:

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

Die Anzahl der NTP-Peers kann mit der folgenden UNIX-Pipeline ermittelt werden:

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

Für NTP Offet verwenden wir:

  • Warnung> 250ms
  • kritisch> 500ms

Für die NTP-Peer-Zählung verwenden wir:

  • keine Warnschwelle
  • kritisch <1

Zabbix-fähige NTP-Überwachungskonfiguration (Quelle: 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 '^\*|^\+'

Nagios-fähige NTP-Überwachungs-Plugins:

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

Ich sollte wirklich zulassen, dass die Warn- und kritischen Schwellenwerte in den Nagios-Skripten mit -w und -c konfiguriert werden können. Ohne das sind sie nicht wirklich vollständig Plug-in-fähig. Weitere Anleitungen dazu finden Sie in einem Tutorial hier: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Es wird behauptet, dass Chrony Ihren Anwendungsfall besser handhabt als NTPd (Netzwerk und Computer ein / aus, Suspendieren usw.). Sehen

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

RE warum halte ich chronny für gut: Es war auf meinem Fedora-Rechner vorinstalliert und ich hatte noch nie ein Problem damit (ich habe es seit Jahren benutzt). Ich hatte in der Vergangenheit auch noch nie Probleme mit ntpd, aber wenn Sie den Link lesen, den ich bereitgestellt habe, finden Sie einige Informationen, warum chrony für nicht immer auf Computern besser ist. Aus diesem Grund habe ich dem OP vorgeschlagen, es auszuprobieren, es könnte für ihn besser funktionieren oder auch nicht. Es ist also nur eine weitere gute Option, die Sie ausprobieren sollten, bevor Sie zu viel tunen, optimieren und ntpd hacken.


1
Bitte kommentieren Sie, wenn Sie mit Ihrem rational
akostadinov

Warum denkst du, ist Chronik besser?
DFC

@dfc, es war auf meinem Fedora-Rechner vorinstalliert und ich hatte noch nie ein Problem damit (ich habe es seit Jahren benutzt). Ich hatte in der Vergangenheit auch noch nie Probleme mit ntpd, aber wenn Sie den Link lesen, den ich bereitgestellt habe, finden Sie einige Informationen, warum chrony für nicht immer auf Computern besser ist. Aus diesem Grund habe ich dem OP vorgeschlagen, es auszuprobieren, es könnte für ihn besser funktionieren oder auch nicht. Es ist also nur eine weitere gute Option, die Sie ausprobieren sollten, bevor Sie zu viel tunen, optimieren und ntpd hacken.
Akostadinov

Fügen Sie diese Informationen lieber in die Antwort selbst ein. Es ist wertvoll genug, und Sie könnten möglicherweise die Abstimmung rückgängig machen.
Tshepang

Da Ihre Antwort nicht mit der tatsächlichen Frage übereinstimmt, ist es meiner Meinung nach besser, einen Kommentar zu der Frage abzugeben.
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

Wie die vorherige Antwort oben, aber mit einer geringfügigen Änderung, wie der vorherige Befehl die if-Anweisung für so viele Offsets ausführt, dh wenn der Offset 3 ist, wird NTP innerhalb von 0,1 ... 3-mal vor dem Schließen gedruckt. Es könnte ärgerlich sein, wenn Sie einen Server haben, der weit von der Synchronisation entfernt ist. Es gibt wahrscheinlich auch eine Möglichkeit, die for-Schleife zu entfernen ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.