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

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

我正在尝试使用 NTPD 将我的 Linux 计算机的时间更新到指定的 NTP 服务器。
以下是场景:

每次 Linux 机器启动时,我想从 NTP 服务器更新时间并如果不成功,我想每5分钟重试一次,直到成功(最长为 2 小时)。

我四处搜索,发现我应该(?)使用 NTPD 并使用一些命令,例如:

#ntpdate ntp.server.com(开始 NTPD 之前)
#ntpd some_options_to_start

问题是:

  1. 我如何知道这些命令是否成功更新了时间?
  2. 我可以设置从 ntpd 更新时间的间隔吗? (或者我必须在 shell 中使用类似sleepand 循环do.. while/的东西for?)

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

答案1

使用脚本进行监控ntpd并不常见。通常使用诸如nagios或 之类的监视工具munin来监视守护进程。当出现问题时,该工具可以向您发送警报。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

答案2

要回答第一个问题,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被弃用,已替换为ntpq.ntpq有一个“peers”交互式命令,它确实给出了以毫秒为单位的“偏移”。我的 Redhat 服务器有 和ntpdcntpq所以你需要小心。

答案3

使用 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

答案4

我还在 @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`

相关内容