Jak sprawdzić, czy NTPD z powodzeniem aktualizuje czas maszyny przy użyciu powłoki?


21

Próbuję użyć NTPD, aby zaktualizować czas mojego komputera z systemem Linux do określonego serwera NTP.
Oto scenariusz:

Za każdym razem, gdy uruchamia się maszyna z systemem Linux, chcę aktualizować czas z serwera NTP, a jeśli to się nie powiedzie, chcę próbować co 5 minut, aż do pomyślnego zakończenia (maksymalnie 2 godziny).

Rozejrzałem się i stwierdziłem, że powinienem (?) Użyć NTPD i użyć polecenia, takiego jak:

#ntpdate ntp.server.com (przed uruchomieniem NTPD)
#ntpd some_options_to_start

Pytania są następujące:

  1. Skąd mam wiedzieć, czy czas został pomyślnie zaktualizowany przez te polecenia?
  2. Czy mogę ustawić interwał aktualizacji czasu z NTTP? (czy muszę użyć czegoś takiego sleepi zapętlić z do.. while/ forw powłoce?)

Zauważ, że chcę wykonać powyższe polecenia w skrypcie powłoki i umieszczę powłokę na serwerze WWW. Następnie klienci (z przeglądarką przeglądarki internetowej) wykonają skrypt na stronie internetowej. Muszę więc sprawdzić, czy aktualizacja się powiodła, czy nie, aby wysłać wynik do klienta (przez Internet).

Odpowiedzi:


22

Używanie skryptu do monitorowania ntpdnie jest często wykonywane. Zwykle do monitorowania demona służy narzędzie monitorujące, takie jak nagioslub munin. Narzędzie może wysłać Ci alert, gdy coś pójdzie nie tak. Mam muninwiadomość e-mail, jeśli przesunięcie przekracza 15 milisekund.

Zwykle należy używać nieparzystej liczby serwerów, aby demon mógł przeprowadzić wybory między serwerami, jeśli jeden ulegnie awarii. Trzy są zwykle wystarczające, a więcej niż pięć to za dużo. Klienci w sieci wewnętrznej powinni mieć dostęp do jednego serwera wewnętrznego, jeśli go monitorujesz. Używaj legalnych serwerów lub serwerów NTP lub DNS swoich dostawców usług internetowych jako źródeł zegara. Istnieją pule publiczne, a także serwery publiczne.

ntpdjest samostrojeniem i nie trzeba go dostosowywać po skonfigurowaniu i uruchomieniu. Dzięki ostatnim ntpdimplementacjom możesz ntpdatecałkowicie zrezygnować z używania, ponieważ mogą one dokonać wstępnego ustawienia daty.

Poniższy skrypt przeanalizuje przesunięcia na wyjściu ntpd i zgłosi nadmierne przesunięcie. Możesz uruchomić go z crona na e-mail, jeśli występują problemy. Skrypt domyślnie ostrzega o przesunięciu 0,1 sekundy.

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

To pierwszy przypadek, kiedy słyszałem o każdym, kto monitoruje czas systemowy. Doskonała odpowiedź.
Bruce Ediger,

@BillTHor: Świetna odpowiedź. Wielkie dzięki. Spróbuję zastosować go do mojej obecnej pracy
widzi

@BruceEdiger Rozumiem, że nigdy nie słyszałeś o ludziach z listy mailingowej „Orzechy czasu”.
dfc

O ile „Korzystanie ze skryptu do monitorowania ntpd nie jest powszechnie wykonywane”, to: katalog skryptów w tarball ntp wskazuje na przeciwny wniosek.
dfc

@dvc Wydaje się, że skrypty nie zawierają żądanej funkcjonalności. Wydaje się, że jest trochę kodu do generowania pułapek SNMP, ale nie spotkałem SNMP do monitorowania NTP. Musiałem przeprowadzić własny monitoring w kilku dużych organizacjach.
BillThor

8

Użyj 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
Na Ubuntu 16.04 znalazłem buggy ntpstat. Po odłączeniu mojego kabla sieciowego nadal był pokazywany jako zsynchronizowany ze statusem powrotu 0, chociaż ntpq -pnie pokazywał żadnych peerów. Więc nie ufam temu narzędziu.
Huygens

8

Aby odpowiedzieć na pierwsze pytanie, ntpdatezwykle mówi ci, co zrobił, a może nie.

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

Demon NTP ntpddziała stale i /etc/ntp.confco jakiś czas prosi serwery NTP (zwykle skonfigurowane ) o czas. Nie powinieneś uruchamiać skryptu co 5 minut. ntpdatepowinien doprowadzić maszynę do synchronizacji z serwerem i ntpdbędzie działać w tle i utrzymywać synchronizację. Nie ustawiasz interwału, który próbuje ntpd, dostosowuje interwał na podstawie tego, jak postrzega lokalny zegar dryfuje z serwerów, i jakości połączeń z serwerami.

Możesz użyć programu o nazwie, ntpdcaby zobaczyć, co ntpdzachowuje jako informacje:

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>

Myślę, że liczba, którą zwykle interesujesz, to „przesunięcie”, czyli liczba sekund, w których zegar lokalny jest wyłączony z zegara serwera.

Jako manstrona ntpdcstanów dla polecenia „peers”:

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

Zatem „przesunięcie” jest w sekundach.

Wygląda na ntpdcto, że jest przestarzałe, zastąpione przez ntpq. ntpqma interaktywne polecenie „peers”, które daje „offset” w milisekundach. Serwer posiada zarówno RedHat ntpdci ntpq, więc trzeba być ostrożnym.


Świetny! Ale w moim pytaniu jest niejasna część. Zamierzam wykonać skrypt powłoki w programie C. I chciałem sprawdzić wartość zwracaną (może użyję funkcji systemowej („shellscript”)). Twoja odpowiedź podpowiada mi, że nie powinniśmy ustawiać interwału dla NTPD i na wszelki wypadek chcę zmienić serwer NTP, muszę edytować plik ntp.conf. Czy możesz mi powiedzieć, w jaki sposób ntpd działa z serwerem ntp. Czy muszę ponownie uruchomić demona ntpd po edycji pliku ntp.conf (ponownie za pomocą skryptu powłoki )
widzi

NTTP jest procesem demona - działa nieprzerwanie. Decyduje, jak często pytać serwer o bieżący czas oraz jak często i ile należy zmieniać zegar lokalny, w zależności od tego, jak dryfuje zegar lokalny: tak naprawdę nie można kontrolować żadnego z interwałów. ntpd działa w tle. Aby zmienić serwer NTP, edytuj plik /etc/ntp.conf, zatrzymaj się i uruchom ntpd.
Bruce Ediger,

Powinienem również wspomnieć, że opublikowany fragment kodu powinien zostać uruchomiony na poziomie 3 lub powyżej poziomu uruchamiania 3 podczas rozruchu. ntpdate ustawia zegar systemowy, następnie ntpd staje się procesem demona i utrzymuje synchronizację zegara z serwerami. Zwykle nie uruchamiasz tych 2 wierszy kodu, aby po prostu „ustawić zegar”.
Bruce Ediger,

Mam to. Co powiesz na ntpdate, gdy otrzyma zły serwer ntpserver (na przykład) i nie działa poprawnie. Skąd mogę to wiedzieć ze skryptów powłoki?
widzi

7

ntp-wait został stworzony dla tego problemu.

Pięć minut man ntp-waiti powinieneś być gotowy ...


Znalazłem ntp-wait w debianie, ale nie w centach. proszę pomóż !
Massimo,

2

Dodałem do skryptu bash @BillTHor również sprawdzenie kodu wyjścia 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

[AKTUALIZACJA], ponieważ skrypt korzystający z danych wyjściowych ntpq był nieużyteczny dla dużych przesunięć (więcej niż 4 cyfry przesunięcia) Próbowałem nowej wersji, używając tylko 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

Przesunięcie NTP można uzyskać za pomocą następującego potoku UNIX:

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

Liczbę rówieśników NTP można uzyskać za pomocą następującego potoku UNIX:

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

Do biura NTP używamy:

  • ostrzeżenie> 250ms
  • krytyczne> 500ms

Do liczenia rówieśników NTP używamy:

  • brak progu ostrzegawczego
  • krytyczny <1

Konfiguracja monitorowania NTP gotowa na Zabbix (źródło: 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 '^\*|^\+'

Wtyczki monitorujące NTP gotowe do 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

Naprawdę powinienem pozwolić, aby ostrzeżenia i progi krytyczne w skryptach Nagios były konfigurowalne za pomocą -w i -c. Bez tego nie są w pełni gotowe do wtyczek. Dalsze wskazówki na ten temat w samouczku tutaj: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Chrony twierdzi, że lepiej obsługuje przypadek użycia niż NTPd (włączanie / wyłączanie sieci i urządzenia, zawieszanie itp.). Widzieć

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

RE, dlaczego uważam, że chronny jest dobry: Przyszedł wstępnie zainstalowany na mojej maszynie Fedora i nigdy nie miałem z tym problemu (używałem go od lat). Nigdy wcześniej nie miałem problemów z ntpd, ale jeśli przeczytasz w podanym przeze mnie linku, jest kilka informacji, dlaczego chrony jest lepszy dla nie zawsze na komputerach. Właśnie dlatego zasugerowałem op, aby wypróbował to, może, ale nie musi, działać lepiej dla niego. Jest to więc kolejna dobra opcja do wypróbowania, zanim zaczniesz zbyt wiele dostrajać, optymalizować i hakować ntpd.


1
prosimy o komentarz, jeśli głosujesz za swoim racjonalnym
akostadinov

Jak myślisz, dlaczego chrony jest lepszy?
dfc

@dfc, został zainstalowany fabrycznie na mojej maszynie fedora i nigdy nie miałem z tym problemu (używałem go od lat). Nigdy wcześniej nie miałem problemów z ntpd, ale jeśli przeczytasz w podanym przeze mnie linku, jest kilka informacji, dlaczego chrony jest lepszy dla nie zawsze na komputerach. Właśnie dlatego zasugerowałem op, aby wypróbował to, może, ale nie musi, działać lepiej dla niego. Jest to więc kolejna dobra opcja do wypróbowania, zanim przejdziesz do zbytniego strojenia, optymalizacji i hakowania ntpd.
akostadinov

Dodaj raczej te informacje do samej odpowiedzi. Jest to wystarczająco cenne i możesz po prostu cofnąć głosowanie.
tshepang

Biorąc pod uwagę, że twoja odpowiedź nie pasuje do rzeczywistego pytania, moim zdaniem lepiej jest być komentarzem do pytania.
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

To samo co poprzednia odpowiedź powyżej, ale z niewielką modyfikacją, ponieważ poprzednie polecenie uruchomi instrukcję if dla tylu przesunięć, tzn. Jeśli przesunięcie wynosi 3, to wydrukuje NTP w granicach 0,1 .... 3 razy przed zamknięciem. Może to być denerwujące, jeśli masz serwer, który jest daleko od synchronizacji. Prawdopodobnie istnieje również sposób na usunięcie pętli for ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.