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

see*_*ees 22 ntpd time

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

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

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

#ntpdate ntp.server.com (在启动NTPD之前)
#ntpd some_options_to_start

问题是:

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

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

Bil*_*hor 23

使用脚本进行监控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
Run Code Online (Sandbox Code Playgroud)


Bru*_*ger 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
Run Code Online (Sandbox Code Playgroud)

NTP 守护进程ntpd不断运行,并/etc/ntp.conf每隔一段时间向 NTP 服务器(通常在 中配置)询问时间。您不必每 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>
Run Code Online (Sandbox Code Playgroud)

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

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

the current estimated delay, offset and dispersion of the peer, all in seconds.
Run Code Online (Sandbox Code Playgroud)

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

似乎ntpdc已弃用,取而代之的是ntpq. ntpq有一个“peers”交互式命令,它以毫秒为单位给出“偏移量”。我的 Redhat 服务器有ntpdcntpq,所以你需要小心。


小智 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
Run Code Online (Sandbox Code Playgroud)


dfc*_*dfc 7

ntp-wait 是为这个问题而生的。

五分钟,man ntp-wait你应该开始运行......