Làm cách nào để kiểm tra xem NTPD có cập nhật thành công thời gian sử dụng shell không?


21

Tôi đang cố gắng sử dụng NTPD để cập nhật thời gian máy Linux của mình lên máy chủ NTP được chỉ định.
Đây là kịch bản:

Mỗi lần máy Linux khởi động, tôi muốn cập nhật thời gian từ máy chủ NTP và nếu nó không thành công, tôi muốn thử lại sau mỗi 5 phút cho đến khi thành công (tối đa là 2 giờ).

Tôi đã tìm kiếm xung quanh và thấy rằng tôi nên (?) Sử dụng NTPD và sử dụng một số lệnh như:

#ntpdate ntp.server.com (trước khi bắt đầu NTPD)
#ntpd some_options_to_start

Các câu hỏi là:

  1. Làm thế nào tôi có thể biết nếu thời gian được cập nhật thành công bởi các lệnh này?
  2. Tôi có thể đặt khoảng thời gian để cập nhật thời gian từ ntpd không? (hoặc tôi phải sử dụng một cái gì đó như sleepvà lặp với do.. while/ fortrong shell?)

Lưu ý rằng tôi muốn thực thi các lệnh trên trong tập lệnh shell và sẽ đặt shell vào máy chủ web. Sau đó, khách hàng (với trình duyệt trình duyệt web) sẽ thực thi tập lệnh trên trang web. Vì vậy, tôi cần kiểm tra xem bản cập nhật có thành công hay không để gửi kết quả cho khách hàng (qua web).

Câu trả lời:


22

Sử dụng một kịch bản để theo dõi ntpdkhông được thực hiện phổ biến. Thông thường một công cụ giám sát như nagioshoặc muninđược sử dụng để giám sát daemon. Công cụ này có thể gửi cho bạn một cảnh báo khi có sự cố. Tôi đã muningửi email cho tôi nếu phần bù vượt quá 15 mili giây.

Thông thường, bạn nên sử dụng một số lượng máy chủ lẻ để daemon có thể thực hiện một cuộc bầu cử giữa các máy chủ nếu một máy chủ tắt. Ba thường là đủ, và hơn năm là quá mức. Khách hàng trên mạng nội bộ của bạn sẽ có thể truy cập bằng một máy chủ nội bộ nếu bạn giám sát nó. Sử dụng máy chủ hợp pháp hoặc máy chủ ISP NTP hoặc DNS của bạn làm nguồn đồng hồ. Có hồ bơi công cộng cũng như máy chủ công cộng.

ntpdlà tự điều chỉnh và bạn không cần phải điều chỉnh nó một khi nó được cấu hình và bắt đầu. Với các ntpdtriển khai gần đây, bạn có thể bỏ ntpdatehoàn toàn việc sử dụng vì chúng có thể thực hiện cài đặt ban đầu của ngày.

Kịch bản sau đây sẽ phân tích các offset trong đầu ra của ntpd và báo cáo phần bù quá mức. Bạn có thể chạy nó từ cron để gửi email cho bạn nếu có vấn đề. Kịch bản mặc định để cảnh báo trên độ lệch 0,1 giây.

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

Đây là ví dụ đầu tiên tôi nghe thấy về bất kỳ ai theo dõi thời gian hệ thống. Câu trả lời tuyệt vời.
Bruce Ediger

@BillTHor: Câu trả lời tuyệt vời. Cảm ơn rất nhiều. Sẽ cố gắng áp dụng nó vào công việc hiện tại của tôi
xem

@BruceEdiger Tôi lấy nó mà bạn chưa bao giờ nghe nói về những người trong danh sách gửi thư thời gian.
dfc

Theo như "Sử dụng tập lệnh để theo dõi ntpd thường không được thực hiện"; thư mục script bên trong tarball ntp trỏ đến kết luận ngược lại.
dfc

@dvc Các tập lệnh ở đó dường như không bao gồm các chức năng được yêu cầu. Dường như có một số mã để tạo bẫy SNMP, nhưng tôi chưa gặp SNMP để theo dõi NTP. Tôi đã phải thực hiện giám sát của riêng mình trong một số tổ chức lớn.
BillThor

8

Sử dụng 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
Trên Ubuntu 16.04, tôi đã tìm thấy lỗi ntpstat. Sau khi rút cáp mạng của tôi, nó vẫn được hiển thị là đồng bộ hóa với trạng thái trả về 0, mặc dù ntpq -pkhông hiển thị đồng nghiệp. Vì vậy, tôi không tin tưởng tiện ích này.
Huygens

8

Để trả lời câu hỏi đầu tiên, ntpdatethường cho bạn biết những gì nó đã làm, hoặc có thể không làm.

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

Trình nền NTP ntpd, chạy liên tục và yêu cầu các máy chủ NTP (thường được cấu hình trong /etc/ntp.conf) thường xuyên. Bạn không cần phải chạy tập lệnh của mình cứ sau 5 phút. ntpdatenên đưa máy vào gần đồng bộ với máy chủ và ntpdsẽ chạy ở chế độ nền và giữ cho nó đồng bộ. Bạn không đặt khoảng thời gian mà ntpd cố gắng, nó sẽ điều chỉnh khoảng thời gian dựa trên cách cảm nhận đồng hồ trôi cục bộ từ máy chủ và chất lượng của các kết nối đến máy chủ.

Bạn có thể sử dụng một chương trình có tên ntpdcđể xem những gì ntpdlưu giữ như thông tin:

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>

Tôi nghĩ rằng số bạn thường quan tâm là "bù", đó là số giây đồng hồ cục bộ của bạn tắt từ đồng hồ của máy chủ.

mantrang dành cho ntpdccác trạng thái của lệnh "đồng nghiệp":

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

Vì vậy, rõ ràng, "bù" là trong vài giây.

Nó xuất hiện mà ntpdcbị phản đối, thay thế bằng ntpq. ntpqcó một lệnh tương tác "ngang hàng", sẽ cho "offset" tính bằng mili giây. Máy chủ Redhat của tôi có cả hai ntpdcntpq, vì vậy bạn sẽ cần cẩn thận.


Tuyệt quá! Nhưng có một phần không rõ ràng trong câu hỏi của tôi. Tôi sẽ thực thi một kịch bản shell trong chương trình C. Và muốn kiểm tra giá trị trả về (có thể tôi sẽ sử dụng hàm hệ thống ("shellscript")). Câu trả lời của bạn cho tôi một ý tưởng rằng chúng ta không nên đặt khoảng thời gian cho NTPD và chỉ trong trường hợp, tôi muốn thay đổi máy chủ NTP, tôi phải chỉnh sửa tệp ntp.conf. Bạn có thể cho tôi biết cách ntpd hoạt động với máy chủ ntp. Tôi có phải khởi động lại ntpd daemon sau khi chỉnh sửa tệp ntp.conf (một lần nữa bằng cách sử dụng shell script )
xem

ntpd là một quá trình daemon - nó chạy liên tục. Nó quyết định tần suất yêu cầu máy chủ cho thời gian hiện tại và tần suất và mức độ thay đổi đồng hồ cục bộ, dựa trên mức độ đồng hồ cục bộ trôi: bạn thực sự không thể kiểm soát bất kỳ khoảng thời gian nào. ntpd chạy trong nền. Để thay đổi máy chủ NTP, bạn chỉnh sửa /etc/ntp.conf và dừng sau đó bắt đầu ntpd.
Bruce Ediger

Tôi cũng nên đề cập rằng đoạn mã bạn đã đăng nên được chạy ở hoặc trên runlevel 3 trong khi khởi động. ntpdate đặt đồng hồ hệ thống, sau đó ntpd trở thành một tiến trình daemon và giữ cho đồng hồ được đồng bộ hóa với các máy chủ. Thông thường, bạn không chạy 2 dòng mã đó để chỉ "đặt đồng hồ".
Bruce Ediger

Tôi đạt được rồi. Làm thế nào về ntpdate khi nó nhận được ntpserver sai (ví dụ) và không hoạt động chính xác. Làm thế nào tôi có thể biết nó từ shell script?
xem

7

ntp-wait đã được thực hiện cho vấn đề này.

Năm phút với man ntp-waitvà bạn sẽ phải chạy và chạy ...


Tôi tìm thấy ntp-Wait trong debian, nhưng không phải bằng centos. Hãy giúp tôi !
Massimo

2

Tôi đã thêm vào tập lệnh bash @BillTHor cũng là một kiểm tra cho mã thoát 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

[CẬP NHẬT] do tập lệnh sử dụng đầu ra ntpq không đáng tin cậy cho offset lớn (hơn 4 chữ số bù) Tôi đã thử một phiên bản mới chỉ sử dụng 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

Có thể thu được bù NTP với đường ống UNIX sau:

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

Số lượng ngang hàng NTP có thể thu được bằng đường ống UNIX sau:

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

Đối với NTP offet, chúng tôi sử dụng:

  • cảnh báo> 250ms
  • quan trọng> 500ms

Đối với số lượng ngang hàng NTP, chúng tôi sử dụng:

  • không có ngưỡng cảnh báo
  • quan trọng <1

Cấu hình giám sát NTP sẵn sàng của Zabbix (nguồn: 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 '^\*|^\+'

Các plugin giám sát NTP sẵn sàng của Nagios:

kiểm tra_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

Tôi thực sự nên để các ngưỡng cảnh báo và quan trọng trong tập lệnh Nagios có thể được cấu hình bằng -w và -c. Họ không thực sự hoàn toàn sẵn sàng plugin mà không có điều đó. Hướng dẫn thêm về điều đó trong một hướng dẫn ở đây: http://www.kernel-panic.it/openbsd/nagios/nagios6.html


1

Chrony được yêu cầu xử lý trường hợp sử dụng của bạn tốt hơn NTPd (bật / tắt mạng và máy, tạm dừng, v.v.). Xem

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

RE tại sao tôi nghĩ chronny là tốt: Nó được cài đặt sẵn trên máy fedora của tôi và tôi chưa bao giờ có bất kỳ vấn đề nào với nó (đã sử dụng nó trong nhiều năm nay). Tôi chưa bao giờ gặp vấn đề với ntpd trong quá khứ nhưng nếu bạn đọc trên liên kết tôi đã cung cấp, có một số thông tin về lý do tại sao chrony tốt hơn cho không phải lúc nào cũng trên máy. Đó là lý do tại sao tôi đề nghị với op dùng thử, nó có thể hoặc không thể làm việc tốt hơn cho anh ta. Vì vậy, nó chỉ là một lựa chọn tốt khác để thử trước khi đi vào quá nhiều điều chỉnh, tối ưu hóa và hack ntpd.


1
vui lòng bình luận nếu bạn downvote với lý trí của bạn
akostadinov

Tại sao bạn nghĩ chrony là tốt hơn?
dfc

@dfc, nó được cài đặt sẵn trên máy fedora của tôi và tôi chưa bao giờ gặp vấn đề gì với nó (đã sử dụng nó trong nhiều năm nay). Tôi chưa bao giờ gặp vấn đề với ntpd trong quá khứ nhưng nếu bạn đọc trên liên kết tôi đã cung cấp, có một số thông tin về lý do tại sao chrony tốt hơn cho không phải lúc nào cũng trên máy. Đó là lý do tại sao tôi đề nghị với op dùng thử, nó có thể hoặc không thể làm việc tốt hơn cho anh ta. Vì vậy, nó chỉ là một lựa chọn tốt khác để thử trước khi đi vào quá nhiều điều chỉnh, tối ưu hóa và hack ntpd.
akostadinov

Thay vì thêm thông tin này vào chính Câu trả lời. Nó là đủ giá trị, và bạn chỉ có thể đảo ngược phiếu bầu.
tshepang

Cho câu trả lời của bạn không phù hợp với câu hỏi thực tế, theo tôi là nó phù hợp hơn để nhận xét về câu hỏi.
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

Giống như câu trả lời trước ở trên, nhưng với một sửa đổi nhỏ vì lệnh trước sẽ chạy câu lệnh if cho càng nhiều offset, tức là nếu offset là 3 thì nó sẽ in NTP trong vòng 0,1 .... 3 lần trước khi đóng. Có thể gây phiền nhiễu nếu bạn có một máy chủ không còn đồng bộ. Có lẽ có một cách để loại bỏ vòng lặp for ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.