如何使用Shell检查NTPD是否成功更新了机器时间?


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?)

请注意,我想在Shell脚本中执行上述命令,并将Shell放入Web服务器。然后,客户端(使用Web浏览器浏览器)将在网站上执行脚本。因此,我需要检查更新是否成功或是否通过网络将结果发送到客户端。

Answers:


22

ntpd通常不使用脚本来监视。通常使用监视工具(例如nagiosmunin)来监视守护程序。发生问题时,该工具可以向您发送警报。munin如果偏移量超过15毫秒,我会通过电子邮件发送给我。

通常,您应该使用奇数个服务器,以便守护进程可以在服务器关闭时在服务器之间执行选择。通常三个就足够了,超过五个就足够了。如果您监视内部网络,则内部网络上的客户端应该能够与一台内部服务器并驾齐驱。使用合法服务器或您的ISP 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我认为您从未听说过Time-nuts邮件列表中的相关人员。
dfc

至于“通常不使用脚本监视ntpd”,ntp tarball内的scripts目录指向相反的结论。
dfc

@dvc那里的脚本似乎并不包含所请求的功能。似乎有些代码可以生成SNMP陷阱,但是我没有遇到过SNMP来监视NTP。我不得不在几个大型组织中进行自己的监视。
BillThor 2014年

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有问题。拔出网络电缆后,尽管未ntpq -p显示任何对等点,但仍显示为与返回状态0同步。因此,我不信任该实用程序。
惠更斯(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守护程序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>

我认为您通常感兴趣的数字是“偏移”,即本地时钟偏离服务器时钟的秒数。

作为“ peers”命令的状态man页面ntpdc

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

因此,很明显,“偏移”以秒为单位。

似乎ntpdc已弃用,由代替ntpqntpq有一个“ peers”交互式命令,它以毫秒为单位给出“偏移”。我的Redhat服务器同时具有ntpdcntpq,因此您需要小心。


大!但是我的问题中有一个不清楚的部分。我将在C程序中执行Shell脚本。并想检查返回值(也许我将使用system(“ shellscript”)函数)。您的回答告诉我,我们不应该为NTPD设置时间间隔,以防万一我想更改NTP服务器,必须编辑ntp.conf文件。您能否告诉我ntpd与ntp服务器一起工作的方式。我一定要重新启动NTPD守护进程(再次使用编辑ntp.conf文件后shell脚本
看到

ntpd是一个守护进程-它连续运行。它根据本地时钟的漂移情况来决定向服务器询问当前时间的频率以及更改本地时钟的频率和数量:您实际上无法控制任何间隔。ntpd在后台运行。要更改NTP服务器,请编辑/etc/ntp.conf,然后停止然后启动ntpd。
布鲁斯·埃迪格

我还应该提到,您发布的代码片段应该在引导期间在运行级别3或更高级别运行。ntpdate设置系统时钟,然后ntpd成为守护进程,并将时钟同步到服务器。通常,您不会运行这两行代码来“设置时间”。
Bruce Ediger

我知道了。当ntpdate收到错误的ntpserver(例如)并且无法正常工作时,该如何处理。我怎么能从shell脚本中得知呢?
看到

7

ntp-wait 是为了解决这个问题。

五分钟的时间,man ntp-wait您就应该启动并运行...


我在debian中找到了ntp-wait,但在centos中却找不到。请帮忙 !
Massimo 2015年

2

我在@BillTHor bash脚本中添加了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

可以通过以下UNIX管道获得NTP偏移量

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

可以使用以下UNIX管道获得NTP对等体计数

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

对于NTP服务,我们使用:

  • 警告> 250ms
  • 临界> 500ms

对于NTP对等体计数,我们使用:

  • 无警告阈值
  • 严重<1

支持Zabbix的NTP监视配置(来源: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的NTP监视插件:

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很好:它已预先安装在我的fedora机器上,所以我从未遇到过任何问题(已使用多年)。过去,我也从未遇到过ntpd的问题,但是如果您阅读我提供的链接,则会发现一些信息,说明为什么chrony对于不总是在计算机上使用来说更好。这就是为什么我建议操作者尝试一下,它可能对他来说更好或更不起作用。因此,这是尝试进行过多的调优,优化和修改ntpd之前的另一种不错的选择。


1
如果您对自己的理性
投反对票,

为什么您认为chrony更好?
dfc 2014年

@dfc,它已预装在我的fedora机器上,我从未遇到过任何问题(已使用多年)。过去,我也从未遇到过ntpd的问题,但是如果您阅读我提供的链接,则会发现一些信息,说明为什么chrony对于不总是在计算机上使用来说更好。这就是为什么我建议操作者尝试一下,它可能对他来说更好或更不起作用。因此,这是尝试进行过多的调优,优化和修改ntpd之前的另一种不错的选择。
akostadinov 2014年

而是在“答案”本身上添加此信息。它足够有价值,您可能会反驳投票。
tshepang 2014年

鉴于您的答案与实际问题不符,我认为更适合作为对该问题的评论。
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语句,即,如果offset为3,则它将在关闭前打印NTP,误差在0.1 .... 3倍以内。如果您的服务器长时间不同步,可能会很烦人。也许还有一种方法可以删除for循环...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.