NTPD'nin makinenin zamanını kabuk kullanarak başarılı bir şekilde güncelleyip güncellemediğini kontrol etmek nasıl?


21

Linux makinemin saatini belirli bir NTP sunucusuna güncellemek için NTPD kullanmaya çalışıyorum.
İşte senaryo:

Linux makinesi her başlatıldığında, NTP sunucusundan saati güncellemek istiyorum ve başarılı olmazsa, başarılı olana kadar her 5 dakikada bir tekrar denemek istiyorum (en fazla 2 saat).

Etrafı araştırdım ve (?) NTPD kullanmam ve aşağıdaki gibi bir komut kullanmam gerektiğini öğrendim:

#ntpdate ntp.server.com (NTPD'ye başlamadan önce)
#ntpd some_options_to_start

Sorular:

  1. Zamanın bu komutlar tarafından başarıyla güncellendiğini nasıl bilebilirim?
  2. Zaman aralığı ntpd'den olacak şekilde ayarlayabilir miyim? (ya sleepda do.. gibi bir şey kullanmalıyım ve .. while/ forin shell ile döngü ?)

Yukarıdaki komutları bir kabuk betiğinde çalıştırmak istediğimi ve kabuğu bir web sunucusuna koyacağımı unutmayın. Ardından istemciler (bir web tarayıcı tarayıcısı ile) web sitesinde komut dosyasını yürütecektir. Bu yüzden, güncellemenin başarılı olup olmadığını kontrol etmem gerekiyor (sonucu müşteriye (web üzerinden) göndermek için).

Yanıtlar:


22

İzlemek için bir komut dosyası kullanarak ntpdyaygın olarak yapılmaz. Genellikle böyle bir izleme aracı nagiosveya munincini izlemek için kullanılır. İşler ters gittiğinde araç size bir uyarı gönderebilir. muninEğer ofset 15 milisaniyeyi aşıyorsa, bana e-posta atıyorum .

Normalde, sıra dışı sayıda sunucu kullanmanız gerekir; böylece arka planda çalışan kullanıcılar sunucu arasında seçim yapabilir. Üç genellikle yeterlidir ve beşten fazlası aşırıdır. Dahili ağınızdaki istemciler, izlerseniz tek bir dahili sunucuyla erişebilmelidir. Meşru sunucuları veya ISS'nizi NTP veya DNS sunucularınızı saat kaynağı olarak kullanın. Ortak havuzların yanı sıra ortak sunucular da vardır.

ntpdkendi kendine ayarlıdır ve yapılandırılıp başlatıldıktan sonra ayarlamanıza gerek kalmaz. Son yapılan ntpduygulamalarla ntpdate, tarihin ilk ayarını yapabildikleri için tamamen kullanımını bırakabilirsiniz .

Aşağıdaki komut dosyası, ntpd çıktısındaki ofsetleri ayrıştırır ve aşırı bir ofset rapor eder. Bir sorun olursa, cron'dan size e-postayla gönderebilirsiniz. Komut varsayılan olarak 0,1 saniyelik bir kayma uyarısı yapar.

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

Bu, sistem zamanını izleyen herhangi birisini duyduğum ilk örnek. Mükemmel cevap
Bruce Ediger

@BillTHor: Harika cevap. Çok teşekkürler. Benim şu anki iş uygulamak deneyecek
görür

@BruceEdiger Anladığım kadarıyla, fındıklı postalama listesindeki kişileri hiç duymamışsınızdır.
dfc

"Ntpd'yi izlemek için bir komut dosyası kullanmak yaygın bir şekilde yapılmıyor" ifadesine göre; NTP tarball içindeki scriptler dizini bunun tersi sonucuna işaret ediyor.
dfc

@dvc Buradaki komut dosyaları istenen işlevselliği içermiyor gibi görünüyor. SNMP tuzakları oluşturmak için bazı kodlar var gibi görünüyor, ancak NTP'yi izlemek için SNMP ile karşılaşmadım. Birkaç büyük kuruluşta kendi izlememi yapmak zorunda kaldım.
BillThor

8

Ntpstat kullanın.

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
Ubuntu 16.04'te ntpstat buggy buldum. Ağ kablosumu çıkardıktan sonra ntpq -p, hiçbir akran göstermese de yine de 0 durumuyla senkronize olarak gösterildi . Yani bu yardımcı programa güvenmiyorum.
Huygens

8

İlk soruyu cevaplamak için ntpdategenellikle ne yaptığını ya da belki yapmadığını söyler.

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

NTP arka plan programı, ntpdsürekli çalışır ve NTP sunucularına (genellikle yapılandırılmış /etc/ntp.conf) her seferinde sıkça sorar . Komut dosyanızı her 5 dakikada bir çalıştırmanız gerekmez. ntpdatemakineyi sunucuyla yakın senkronizasyona getirmeli ve ntpdarka planda çalışacak ve senkronize tutacaktır. Ntpd'nin çalıştığı aralığı ayarlamazsınız, yerel saatin sunuculardan nasıl kaydığını algıladığına ve sunuculara bağlantıların kalitesini nasıl algıladığına bağlı olarak ayarlar.

ntpdcNeyin ntpdbilgi olarak kaldığını görmek için adlı bir program kullanabilirsiniz :

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>

Genel olarak ilgilendiğiniz numaranın "ofset" olduğunu düşünüyorum, bu yerel saatinizin sunucunun saatinden kaç saniye uzakta olduğunu gösterir.

As mansayfa ntpdc"eş" komutu için devletler:

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

Yani, açıkça, "ofset" saniye cinsindendir.

Anlaşılmaktadır ntpdcyerini itiraz edildi ntpq. ntpqmilisaniye cinsinden "ofset" veren bir "eş" etkileşimli komutu vardır. Redhat sunucumun her ikisi de var ntpdcve ntpqbu yüzden dikkatli olmanız gerekecek.


Harika! Ancak sorumun belirsiz bir kısmı var. C programında bir kabuk betiği yürüteceğim. Ve dönüş değerini kontrol etmek istedim (belki sistemi kullanacağım ("shellscript") işlevini). Cevabınız bana NTPD için aralık belirlemememiz gerektiği ve sadece NTP sunucusunu değiştirmek istediğimde ntp.conf dosyasını düzenlemem gerektiği fikrini veriyor. Ntpd'nin ntp sunucusuyla nasıl çalıştığını söyler misiniz? Ntp.conf dosyasını düzenledikten sonra ntpd arka planını yeniden başlatmam gerekir mi (yine kabuk komut dosyası kullanarak )
görüyor

ntpd bir daemon sürecidir - sürekli çalışır. Bir sunucuya şu an için ne sıklıkta sorulacağına ve yerel saatin nasıl kaydığına bağlı olarak yerel saati ne sıklıkta ve ne kadar değiştireceğinize karar verir: aralıkların hiçbirini gerçekten kontrol edemezsiniz. ntpd arka planda çalışır. Bir NTP sunucusunu değiştirmek için, /etc/ntp.conf dosyasını düzenleyin ve ardından ntpd'yi başlatın.
Bruce Ediger

Ayrıca, gönderdiğiniz kod parçasının önyükleme sırasında çalışma seviyesi 3'te veya üstünde çalışması gerektiğini belirtmeliyim. ntpdate sistem saatini ayarlar, ardından ntpd bir arka plan programı olur ve saati sunuculara senkronize eder. Normalde, sadece "saati ayarlamak" için bu 2 kod satırını çalıştırmazsınız.
Bruce Ediger,

Anladım. Yanlış ntpserver (örneğin) aldığında ve düzgün çalışmadığında ntpdate hakkında. Shell komut dosyalarından nasıl bilebilirim?
görür

7

ntp-wait bu sorun için yapıldı.

Beş dakika sonra man ntp-waitçalışmaya hazır olmalısın ...


Ntp-wait'ü debian'da buldum, fakat centos'ta değil. lütfen yardım et !
Massimo

2

@ BillTHor bash betiğine ayrıca ntpdstat çıkış kodu> 0 için bir kontrol ekledim:

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

[GÜNCELLEME], ntpq çıktısını kullanan komut dosyası larget ofset (4 basamaktan fazla ofset) için kullanılmadığından, sadece ntpstat kullanarak yeni bir sürüm denedim:

#!/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 kayması , aşağıdaki UNIX boru hattında elde edilebilir:

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

NTP eş sayısı , aşağıdaki UNIX boru hattıyla elde edilebilir:

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

İçin NTP offet Kullandığımız:

  • uyarı> 250ms
  • kritik> 500ms

İçin NTP akran sayımı Kullandığımız:

  • uyarı eşiği yok
  • kritik <1

Zabbix'e hazır NTP izleme yapılandırması (kaynak: 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'a hazır NTP izleme eklentileri:

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

Nagios betiklerindeki uyarı ve kritik eşik değerlerin -w ve -c ile yapılandırılabilir olmasına gerçekten izin vermeliyim. Gerçekten de tamamen eklentiye hazır değiller. Bununla ilgili daha fazla rehberlik burada bir rehberde: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Chrony'nin kullanım durumunuzu NTPd'den daha iyi kullandığı iddia edilir (ağ ve makine açık / kapalı, askıya alma vb.). Görmek

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

RE neden chronny'nin iyi olduğunu düşünüyorum: Fedora makineme önceden kurulmuş olarak geldi ve onunla hiçbir zaman sorun yaşamadım (yıllarca kullandım). Geçmişte ntpd ile de hiç sorun yaşamadım ama sağladığım bağlantıyı okursanız, chrony'nin her zaman olmayan makinelerde neden daha iyi olduğu konusunda bazı bilgiler var. Bu yüzden denemek için op'a önerdim, onun için daha iyi olabilir veya çalışmayabilir. Bu yüzden ntpd'yi çok fazla ayarlamadan, optimize etmeden ve hacklemeden önce denemek için başka iyi bir seçenek.


1
rasyonel gücünüzü beğenmediyseniz lütfen yorum yapın
akostadinov

Sence chrony daha iyi mi?
dfc

@dfc, fedora makineme önceden yüklenmiş olarak geldi ve onunla hiçbir zaman sorun yaşamadım (yıllarca kullandım). Geçmişte ntpd ile de hiç sorun yaşamadım ama sağladığım bağlantıyı okursanız, chrony'nin her zaman olmayan makinelerde neden daha iyi olduğu konusunda bazı bilgiler var. Bu yüzden denemek için op'a önerdim, onun için daha iyi olabilir veya çalışmayabilir. Bu yüzden ntpd'yi çok fazla ayarlamadan, optimize etmeden ve hacklemeden önce denemek için başka iyi bir seçenek.
akostadinov

Aksine bu bilgiyi Yanıtın kendisine ekler. Yeterince değerli ve oylamayı geri alabilirsiniz.
tshepang

Cevabınız verilen soru ile uyuşmuyorsa, bence bu soru üzerine yorum yapmak daha uygun olur.
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

Yukarıdaki önceki cevaba benzer, ancak önceki komuttaki ufak bir değişiklikle if ifadesini birçok ofset için çalıştıracaktır, yani ofset 3 ise o zaman NTP'yi kapanmadan önce 0.1 .... içinde olduğunu yazacaktır. Senkronizasyon dışında uzun bir süre olan bir sunucunuz varsa can sıkıcı olabilir. For döngüsü kaldırmanın bir yolu da var ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.