Bagaimana cara memeriksa apakah NTPD memperbarui waktu mesin berhasil menggunakan shell?


21

Saya mencoba menggunakan NTPD untuk memperbarui waktu mesin Linux saya ke server NTP yang ditentukan.
Berikut ini skenarionya:

Setiap kali mesin Linux dinyalakan, saya ingin memperbarui waktu dari server NTP dan jika tidak berhasil, saya ingin mencoba lagi setiap 5 menit hingga berhasil (maks. Adalah 2 jam).

Saya mencari-cari dan menemukan bahwa saya harus (?) Menggunakan NTPD dan menggunakan beberapa perintah seperti:

#ntpdate ntp.server.com (sebelum memulai NTPD)
#ntpd some_options_to_start

Pertanyaannya adalah:

  1. Bagaimana saya bisa tahu jika waktu berhasil diperbarui oleh perintah-perintah ini?
  2. Bisakah saya mengatur interval untuk memperbarui waktu dari ntpd? (atau saya harus menggunakan sesuatu seperti sleepdan loop dengan do.. while/ fordi shell?)

Perhatikan bahwa saya ingin menjalankan perintah di atas dalam skrip shell dan akan meletakkan shell di server web. Kemudian klien (dengan browser browser web) akan menjalankan skrip di situs web. Jadi saya perlu memeriksa apakah pembaruan berhasil atau tidak mengirim hasil ke klien (melalui web).

Jawaban:


22

Menggunakan skrip untuk memantau ntpdtidak umum dilakukan. Biasanya alat pemantauan suka nagiosatau munindigunakan untuk memantau daemon. Alat ini dapat mengirimi Anda peringatan ketika ada masalah. Saya telah muninmengirim email kepada saya jika offset melebihi 15 milidetik.

Biasanya, Anda harus menggunakan jumlah server ganjil sehingga daemon dapat melakukan pemilihan di antara server jika ada yang mati. Tiga biasanya memadai, dan lebih dari lima berlebihan. Klien di jaringan internal Anda harus dapat bertahan dengan satu server internal jika Anda memantaunya. Gunakan server yang sah atau ISP NTP atau server DNS Anda sebagai sumber jam. Ada kolam renang umum serta server publik.

ntpdself tuning dan Anda tidak perlu menyesuaikannya setelah dikonfigurasi dan dimulai. Dengan ntpdimplementasi terbaru Anda dapat menghentikan penggunaan ntpdatesepenuhnya karena mereka dapat melakukan pengaturan awal tanggal.

Script berikut akan mem-parsing offset dalam output ntpd dan melaporkan offset yang berlebihan. Anda bisa menjalankannya dari cron ke email Anda jika ada masalah. Script default untuk memberi peringatan pada offset 0,1 detik.

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

Ini adalah contoh pertama yang saya dengar tentang siapa pun yang memonitor waktu sistem. Jawaban yang sangat bagus.
Bruce Ediger

@ BillTor: Jawaban yang bagus. Terima kasih banyak. Akan mencoba menerapkannya pada pekerjaan saya saat ini
lihat

@BruceEdiger Saya kira Anda belum pernah mendengar tentang orang-orang di milis waktu-kacang.
dfc

Sejauh "Menggunakan skrip untuk memantau ntpd tidak umum dilakukan" berlaku; direktori skrip di dalam tarbal ntp menunjuk ke kesimpulan yang berlawanan.
dfc

@dvc Skrip di sana sepertinya tidak menyertakan fungsionalitas yang diminta. Tampaknya ada beberapa kode untuk menghasilkan perangkap SNMP, tapi saya belum menemukan SNMP untuk memantau NTP. Saya harus melakukan pemantauan sendiri di beberapa organisasi besar.
BillThor

8

Gunakan 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
Di Ubuntu 16.04, saya menemukan ntpstat buggy. Setelah mencabut kabel jaringan saya, itu masih ditampilkan sebagai disinkronkan dengan status pengembalian 0, meskipun ntpq -ptidak menunjukkan rekan. Jadi saya tidak mempercayai utilitas ini.
Huygens

8

Untuk menjawab pertanyaan pertama, ntpdatebiasanya memberi tahu Anda apa yang telah dilakukannya, atau mungkin tidak.

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

Daemon NTP ntpd,, berjalan terus-menerus, dan menanyakan server NTP (biasanya dikonfigurasi dalam /etc/ntp.conf) untuk waktu sesering itu. Anda tidak harus menjalankan skrip Anda setiap 5 menit. ntpdateharus membawa mesin menjadi selaras dekat dengan server, dan ntpdakan berjalan di latar belakang dan tetap selaras. Anda tidak mengatur interval yang dicoba ntpd, ia menyesuaikan interval berdasarkan bagaimana ia mempersepsikan drift jam lokal dari server, dan kualitas koneksi ke server.

Anda dapat menggunakan program bernama ntpdcuntuk melihat apa yang ntpddisimpan sebagai informasi:

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>

Saya pikir nomor yang biasanya Anda minati adalah "offset", itu adalah jumlah detik jam lokal Anda dimatikan dari jam server.

Sebagai manlaman untuk ntpdcstatus untuk perintah "rekan":

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

Jadi, jelas, "offset" dalam hitungan detik.

Tampaknya ntpdcsudah usang, diganti dengan ntpq. ntpqmemiliki perintah interaktif "peer", yang memberikan "offset" dalam milidetik. Server Redhat saya memiliki keduanya ntpdcdan ntpq, jadi Anda harus berhati-hati.


Besar! Tetapi ada bagian yang tidak jelas dalam pertanyaan saya. Saya akan menjalankan skrip shell dalam program C. Dan ingin memeriksa nilai kembali (mungkin saya akan menggunakan fungsi system ("shellscript")). Jawaban Anda memberi saya ide bahwa kita tidak boleh menetapkan interval untuk NTPD dan untuk berjaga-jaga, saya ingin mengubah server NTP, saya harus mengedit file ntp.conf. Bisakah Anda memberi tahu saya cara ntpd bekerja dengan server ntp. Apakah saya harus memulai ulang daemon ntpd setelah mengedit file ntp.conf (lagi menggunakan skrip shell )
lihat

ntpd adalah proses daemon - ini berjalan terus menerus. Itu memutuskan seberapa sering meminta server untuk waktu saat ini, dan seberapa sering dan seberapa banyak mengubah jam lokal, berdasarkan pada bagaimana jam lokal melayang: Anda tidak dapat benar-benar mengontrol salah satu interval. ntpd berjalan di latar belakang. Untuk mengubah server NTP, Anda mengedit /etc/ntp.conf, dan berhenti kemudian mulai ntpd.
Bruce Ediger

Saya juga harus menyebutkan bahwa fragmen kode yang Anda posting harus dijalankan pada atau di atas runlevel 3 selama boot. ntpdate mengatur jam sistem, kemudian ntpd menjadi proses daemon, dan menjaga jam disinkronkan ke server. Biasanya, Anda tidak menjalankan 2 baris kode itu hanya dengan "mengatur jam".
Bruce Ediger

Saya mendapatkannya. Bagaimana dengan ntpdate ketika ntpserver salah (misalnya) dan tidak berfungsi dengan benar. Bagaimana saya bisa tahu itu dari skrip shell?
melihat

7

ntp-wait dibuat untuk masalah ini.

Lima menit dengan man ntp-waitdan Anda harus berdiri dan berlari ...


Saya menemukan ntp-tunggu di debian, tetapi tidak dalam centos. tolong bantu !
Massimo

2

Saya menambahkan ke skrip bash @BillTHor juga cek untuk kode keluar 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

[PEMBARUAN] karena skrip yang menggunakan keluaran ntpq tidak berguna untuk sebagian besar offset (lebih dari 4 digit offset) Saya mencoba versi baru menggunakan hanya 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

NTP offset dapat diperoleh dengan pipa UNIX berikut:

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

Hitungan rekan NTP dapat diperoleh dengan pipa UNIX berikut:

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

Untuk offset NTP kami menggunakan:

  • peringatan> 250 ms
  • kritis> 500ms

Untuk jumlah rekan NTP kami menggunakan:

  • tidak ada ambang peringatan
  • kritis <1

Konfigurasi pemantauan NTP siap Zabbix (sumber: 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 pemantauan NTP yang siap-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

Saya benar-benar harus membiarkan peringatan dan ambang kritis dalam skrip Nagios dapat dikonfigurasi dengan -w dan -c. Mereka tidak sepenuhnya siap tanpa plugin. Panduan lebih lanjut tentang itu dalam tutorial di sini: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Chrony diklaim menangani kasus penggunaan Anda lebih baik daripada NTPd (jaringan dan mesin hidup / mati, tunda, dll.). Lihat

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

RE mengapa saya pikir chronny baik: Itu datang pra-instal pada mesin fedora saya dan saya tidak pernah punya masalah dengan itu (menggunakannya selama bertahun-tahun sekarang). Saya tidak pernah memiliki masalah dengan ntpd di masa lalu juga, tetapi jika Anda membaca tautan yang saya berikan, ada beberapa informasi mengapa chrony lebih baik untuk tidak selalu menggunakan mesin. Itu sebabnya saya menyarankan kepada op untuk mencobanya, mungkin atau mungkin tidak bekerja lebih baik untuknya. Jadi itu hanyalah pilihan lain yang baik untuk dicoba sebelum masuk ke terlalu banyak penyetelan, pengoptimalan, dan peretasan ntpd.


1
tolong beri komentar jika Anda downvote dengan rasional Anda
akostadinov

Menurut Anda mengapa chrony lebih baik?
dfc

@ pdf, datang pra-instal di mesin fedora saya dan saya tidak pernah punya masalah dengan itu (menggunakannya selama bertahun-tahun sekarang). Saya tidak pernah memiliki masalah dengan ntpd di masa lalu juga, tetapi jika Anda membaca tautan yang saya berikan, ada beberapa informasi mengapa chrony lebih baik untuk tidak selalu menggunakan mesin. Itu sebabnya saya menyarankan kepada op untuk mencobanya, mungkin atau mungkin tidak bekerja lebih baik untuknya. Jadi itu hanyalah pilihan lain yang baik untuk dicoba sebelum masuk ke terlalu banyak penyetelan, pengoptimalan, dan peretasan ntpd.
akostadinov

Alih-alih menambahkan info ini pada Jawaban itu sendiri. Itu cukup berharga, dan Anda mungkin mendapatkan suara terbalik.
tshepang

Mengingat jawaban Anda tidak cocok dengan pertanyaan yang sebenarnya, menurut saya itu lebih cocok untuk mengomentari pertanyaan itu.
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

Sama seperti jawaban sebelumnya di atas, tetapi dengan sedikit modifikasi seperti perintah sebelumnya akan menjalankan pernyataan if untuk sebanyak offset, yaitu jika offset adalah 3 maka akan mencetak NTP dalam 0,1 .... 3 kali sebelum ditutup. Bisa menjengkelkan jika Anda memiliki server yang jauh dari sinkronisasi. Mungkin ada cara untuk menghapus for for loop juga ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.