จะตรวจสอบว่า NTPD อัพเดตเวลาของเครื่องโดยใช้ shell ได้สำเร็จหรือไม่?


21

ฉันพยายามใช้ NTPD เพื่ออัปเดตเวลาของเครื่อง Linux เป็นเซิร์ฟเวอร์ NTP ที่ระบุ
นี่คือสถานการณ์:

ทุกครั้งที่เครื่อง Linux เริ่มทำงานฉันต้องการอัปเดตเวลาจากเซิร์ฟเวอร์ NTP และหากไม่ประสบความสำเร็จฉันต้องการลองอีกครั้งทุก 5 นาทีจนสำเร็จ (สูงสุดคือ 2 ชั่วโมง)

ฉันค้นหารอบ ๆ และพบว่าฉันควร (?) ใช้ NTPD และใช้คำสั่งบางอย่างเช่น:

#ntpdate ntp.server.com (ก่อนเริ่ม NTPD)
#ntpd some_options_to_start

คำถามคือ:

  1. ฉันจะรู้ได้อย่างไรว่าคำสั่งเหล่านี้ได้รับการอัพเดตเวลาสำเร็จหรือไม่?
  2. ฉันสามารถตั้งช่วงเวลาให้อัพเดทเวลาจาก ntpd ได้หรือไม่? (หรือฉันต้องใช้สิ่งที่ต้องการsleepและวนกับdo.. while/ forในเปลือก?)

โปรดทราบว่าฉันต้องการรันคำสั่งข้างต้นในเชลล์สคริปต์และจะวางเชลล์ในเว็บเซิร์ฟเวอร์ จากนั้นลูกค้า (ที่มีเว็บเบราว์เซอร์เบราว์เซอร์) จะเรียกใช้สคริปต์บนเว็บไซต์ ดังนั้นฉันต้องตรวจสอบว่าการอัปเดตนั้นสำเร็จหรือไม่เพื่อส่งผลลัพธ์ไปยังลูกค้า (ผ่านเว็บ)

คำตอบ:


22

การใช้สคริปต์เพื่อตรวจสอบntpdไม่ได้กระทำโดยทั่วไป โดยปกติแล้วเครื่องมือตรวจสอบเช่นnagiosหรือmuninใช้เพื่อตรวจสอบภูต เครื่องมือนี้สามารถส่งการแจ้งเตือนถึงคุณเมื่อมีสิ่งผิดปกติ ฉันmuninส่งอีเมลถึงฉันถ้าออฟเซ็ตเกิน 15 มิลลิวินาที

โดยปกติคุณควรใช้เซิร์ฟเวอร์จำนวนคี่เพื่อให้ daemon สามารถทำการเลือกตั้งระหว่างเซิร์ฟเวอร์หากมีการปิด สามมักเพียงพอและมากกว่าห้าคือมากเกินไป ลูกค้าในเครือข่ายภายในของคุณควรจะสามารถรับกับเซิร์ฟเวอร์ภายในหนึ่งถ้าคุณตรวจสอบ ใช้เซิร์ฟเวอร์ที่ถูกกฎหมายหรือเซิร์ฟเวอร์ NTP หรือเซิร์ฟเวอร์ DNS ของคุณเป็นแหล่งสัญญาณนาฬิกา มีพูลสาธารณะเช่นเดียวกับเซิร์ฟเวอร์สาธารณะ

ntpdเป็นการปรับจูนด้วยตนเองและคุณไม่จำเป็นต้องปรับมันเมื่อมีการกำหนดค่าและเริ่ม ด้วยntpdการนำไปใช้งานล่าสุดคุณสามารถปล่อยการใช้งานntpdateทั้งหมดเนื่องจากสามารถทำการตั้งค่าเริ่มต้นของวันที่ได้

สคริปต์ต่อไปนี้จะแยกวิเคราะห์ออฟเซ็ตในเอาต์พุตของ ntpd และรายงานออฟเซ็ตที่มากเกินไป คุณสามารถเรียกใช้จาก cron เพื่อส่งอีเมลถึงคุณหากมีปัญหา สคริปต์เริ่มต้นที่จะแจ้งเตือนเกี่ยวกับการชดเชย 0.1 วินาที

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

นี่เป็นอินสแตนซ์แรกที่ฉันได้ยินเกี่ยวกับเวลาของระบบการตรวจสอบทุกคน คำตอบที่ยอดเยี่ยม
Bruce Ediger

@BillTHor: คำตอบที่ดี ขอบคุณมาก. จะพยายามนำไปใช้กับงานปัจจุบันของฉัน
ดู

@ BruceEdiger ฉันคิดว่าคุณไม่เคยได้ยินคนที่อยู่ในรายชื่อผู้รับจดหมายเวลา
dfc

เท่าที่ "การใช้สคริปต์เพื่อตรวจสอบ ntpd ไม่ได้ทำกันโดยทั่วไป" ไป; ไดเร็กทอรีสคริปต์ภายใน ntp tarball ชี้ไปที่ข้อสรุปตรงกันข้าม
dfc

@dvc สคริปต์ที่ดูเหมือนจะไม่รวมฟังก์ชั่นที่ร้องขอ ดูเหมือนว่าจะมีรหัสบางส่วนในการสร้างกับดัก SNMP แต่ฉันไม่พบ SNMP เพื่อตรวจสอบ NTP ฉันต้องตรวจสอบตัวเองในองค์กรขนาดใหญ่หลายแห่ง
BillThor

8

ใช้ 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
บน Ubuntu 16.04 ฉันพบว่า ntpstat buggy หลังจากถอดสายเคเบิลเครือข่ายของฉันแล้วก็ยังคงแสดงว่าซิงโครไนซ์กับสถานะการส่งคืน 0 แม้ว่าจะntpq -pไม่พบเพื่อน ดังนั้นฉันจึงไม่ไว้วางใจโปรแกรมอรรถประโยชน์นี้
Huygens

8

เพื่อตอบคำถามแรกntpdateมักจะบอกคุณว่ามันทำอะไรหรืออาจไม่ได้ทำ

[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 daemon, ntpdทำงานอย่างต่อเนื่องและถามเซิร์ฟเวอร์ NTP (โดยปกติจะกำหนดค่าไว้/etc/ntp.conf) ในเวลาที่บ่อยครั้ง คุณไม่ควรเรียกใช้สคริปต์ของคุณทุก 5 นาที ntpdateควรนำเครื่องเข้าใกล้ซิงค์กับเซิร์ฟเวอร์และntpdจะทำงานในพื้นหลังและเก็บไว้ในซิงค์ คุณไม่ได้ตั้งค่าช่วงเวลาที่ ntpd พยายาม แต่จะปรับช่วงเวลาตามวิธีการที่มันรับรู้สัญญาณนาฬิกาของท้องถิ่นจากเซิร์ฟเวอร์และคุณภาพของการเชื่อมต่อไปยังเซิร์ฟเวอร์

คุณสามารถใช้ชื่อโปรแกรมntpdcเพื่อดูสิ่งที่ntpdเก็บไว้เป็นข้อมูล:

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>

ฉันคิดว่าหมายเลขที่คุณสนใจโดยทั่วไปคือ "ชดเชย" นั่นคือจำนวนวินาทีที่นาฬิกาในเครื่องของคุณออกจากนาฬิกาของเซิร์ฟเวอร์

เป็นmanหน้าสำหรับntpdcสถานะสำหรับคำสั่ง "เพียร์":

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

ดังนั้นชัดเจน "ชดเชย" เป็นวินาที

ดูเหมือนว่าจะเลิกแทนที่ด้วยntpdc มีคำสั่งแบบโต้ตอบ "เพียร์" ซึ่งจะให้ "ออฟเซ็ต" เป็นมิลลิวินาที เซิร์ฟเวอร์ Redhat ของฉันมีทั้งคู่และดังนั้นคุณต้องระวังntpqntpqntpdcntpq


ที่ดี! แต่คำถามของฉันมีส่วนที่ไม่ชัดเจน ฉันจะรันเชลล์สคริปต์ในโปรแกรม C และต้องการตรวจสอบค่าส่งคืน (บางทีฉันจะใช้ฟังก์ชัน system ("shellscript")) คำตอบของคุณทำให้ฉันมีความคิดว่าเราไม่ควรกำหนดช่วงเวลาสำหรับ NTPD และในกรณีที่ฉันต้องการเปลี่ยนเซิร์ฟเวอร์ NTP ฉันต้องแก้ไขไฟล์ ntp.conf คุณบอกฉันได้ไหมว่าวิธีที่ ntpd ทำงานกับเซิร์ฟเวอร์ ntp ฉันต้องรีสตาร์ท ntpd daemon หลังจากแก้ไขไฟล์ ntp.conf (อีกครั้งโดยใช้เชลล์สคริปต์ )
ดู

ntpd เป็นกระบวนการ daemon - มันทำงานอย่างต่อเนื่อง มันตัดสินใจว่าจะถามเซิร์ฟเวอร์ในเวลาปัจจุบันบ่อยแค่ไหนและบ่อยแค่ไหนและจะเปลี่ยนแปลงนาฬิกาในเครื่องมากน้อยเพียงใดขึ้นอยู่กับว่านาฬิกาในระบบของคุณลอยอยู่ที่ใด: คุณไม่สามารถควบคุมช่วงเวลาใด ๆ ได้ ntpd ทำงานในพื้นหลัง ในการเปลี่ยนเซิร์ฟเวอร์ NTP คุณแก้ไข /etc/ntp.conf และหยุดจากนั้นเริ่ม ntpd
Bruce Ediger

ฉันควรจะพูดถึงว่าส่วนรหัสที่คุณโพสต์ควรได้รับการทำงานที่หรือสูงกว่า runlevel 3 ในระหว่างการบูต ntpdate ตั้งค่านาฬิการะบบจากนั้น ntpd จะกลายเป็นกระบวนการ daemon และทำให้นาฬิกาซิงค์กับเซิร์ฟเวอร์ โดยทั่วไปคุณไม่ต้องเรียกใช้รหัส 2 บรรทัดเพื่อเพียงแค่ "ตั้งนาฬิกา"
Bruce Ediger

ฉันเข้าใจแล้ว. วิธีการเกี่ยวกับ ntpdate เมื่อได้รับ ntpserver ผิด (ตัวอย่าง) และทำงานไม่ถูกต้อง ฉันจะรู้ได้อย่างไรจากเชลล์สคริปต์
เห็น

7

ntp-wait ถูกสร้างขึ้นสำหรับปัญหานี้

ห้านาทีด้วยman ntp-waitและคุณควรจะอยู่และทำงาน ...


ฉันพบ ntp-wait ใน debian แต่ไม่ใช่ใน centos กรุณาช่วย !
Massimo

2

ฉันเพิ่มใน @BillTHor สคริปต์ทุบตียังตรวจสอบสำหรับรหัสออก 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

[อัพเดต] เนื่องจากสคริปต์ที่ใช้เอาต์พุต ntpq ไม่เหมาะสมสำหรับออฟเซ็ตขนาดใหญ่ (ออฟเซ็ตมากกว่า 4 หลัก) ฉันลองใช้เวอร์ชันใหม่โดยใช้เฉพาะ 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ได้ด้วยไพพ์ไลน์ UNIX ต่อไปนี้:

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

สามารถรับจำนวนเพียร์ NTPด้วยไพพ์ไลน์ UNIX ต่อไปนี้:

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

สำหรับOffset NTPเราใช้:

  • เตือน> 250 มิลลิวินาที
  • สำคัญ> 500ms

สำหรับจำนวนNTP ของเพียร์เราใช้:

  • ไม่มีเกณฑ์การเตือน
  • วิจารณ์ <1

การตรวจสอบ NTP สำหรับ Zabbix พร้อม (ที่มา: 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 '^\*|^\+'

ปลั๊กอินการตรวจสอบ NTP พร้อม 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

ฉันควรปล่อยให้เกณฑ์การเตือนและวิกฤติที่สำคัญในสคริปต์ Nagios สามารถกำหนดค่าได้ด้วย -w และ -c พวกเขายังไม่พร้อมปลั๊กอินโดยสมบูรณ์ คำแนะนำเพิ่มเติมเกี่ยวกับเรื่องนี้ในบทช่วยสอนที่นี่: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Chrony ถูกอ้างว่าจัดการกรณีการใช้งานของคุณได้ดีกว่า NTPd (เครือข่ายและเครื่องเปิด / ปิดหยุดชั่วคราว ฯลฯ ) ดู

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

RE ทำไมฉันถึงคิดว่า chronny ดี: มันติดตั้งมาพร้อมกับเครื่องของฉันและฉันไม่เคยมีปัญหากับมัน (ใช้งานมาหลายปีแล้ว) ฉันไม่เคยมีปัญหากับ ntpd ในอดีตเช่นกัน แต่ถ้าคุณอ่านในลิงก์ที่ฉันให้ไว้มีข้อมูลบางอย่างเกี่ยวกับสาเหตุที่ chrony ดีกว่าสำหรับเครื่องที่ไม่ได้ทำงานตลอดเวลา นั่นเป็นเหตุผลที่ฉันแนะนำให้ op ลองใช้อาจจะดีกว่าหรือไม่ดีกว่าสำหรับเขา ดังนั้นจึงเป็นอีกตัวเลือกที่ดีที่จะลองก่อนปรับจูนมากเกินไปปรับแต่งและแฮ็ค ntpd


1
โปรดแสดงความคิดเห็นถ้าคุณ downvote ด้วยเหตุผลของคุณ
akostadinov

ทำไมคุณคิดว่า chrony ดีกว่า
dfc

@ pdf มันมาพร้อมกับการติดตั้งบนเครื่อง fedora ของฉันและฉันไม่เคยมีปัญหาใด ๆ กับมัน (ใช้มาหลายปีแล้ว) ฉันไม่เคยมีปัญหากับ ntpd ในอดีตเช่นกัน แต่ถ้าคุณอ่านในลิงก์ที่ฉันให้ไว้มีข้อมูลบางอย่างเกี่ยวกับสาเหตุที่ chrony ดีกว่าสำหรับเครื่องที่ไม่ได้ทำงานตลอดเวลา นั่นเป็นเหตุผลที่ฉันแนะนำให้ op ลองใช้อาจจะดีกว่าหรือไม่ดีกว่าสำหรับเขา ดังนั้นจึงเป็นอีกตัวเลือกที่ดีที่จะลองก่อนปรับจูนมากเกินไปปรับแต่งและแฮ็ค ntpd
akostadinov

ค่อนข้างเพิ่มข้อมูลนี้ในคำตอบตัวเอง มันมีค่ามากพอและคุณอาจได้รับการโหวตกลับ
tshepang

ให้คำตอบของคุณไม่ตรงกับคำถามจริงในความคิดของฉันมันเหมาะกว่าที่จะแสดงความคิดเห็นในคำถาม
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

เช่นเดียวกับคำตอบก่อนหน้าข้างต้น แต่ด้วยการปรับเปลี่ยนเล็กน้อยเช่นเดียวกับคำสั่งก่อนหน้านี้จะเรียกใช้คำสั่ง if สำหรับ offsets มากที่สุดเช่นถ้า offset เป็น 3 แล้วมันจะพิมพ์ NTP ภายใน 0.1 .... 3 ครั้งก่อนปิด อาจเป็นเรื่องน่ารำคาญหากคุณมีเซิร์ฟเวอร์ที่ไม่สามารถซิงค์ได้นาน อาจมีวิธีลบการวนรอบเช่นกัน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.