我正在尝试使用 NTPD 将我的 Linux 计算机的时间更新到指定的 NTP 服务器。
以下是场景:
每次 Linux 机器启动时,我想从 NTP 服务器更新时间并如果不成功,我想每5分钟重试一次,直到成功(最长为 2 小时)。
我四处搜索,发现我应该(?)使用 NTPD 并使用一些命令,例如:
#ntpdate ntp.server.com
(开始 NTPD 之前)
#ntpd some_options_to_start
问题是:
- 我如何知道这些命令是否成功更新了时间?
- 我可以设置从 ntpd 更新时间的间隔吗? (或者我必须在 shell 中使用类似
sleep
and 循环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 服务器有 和ntpdc
,ntpq
所以你需要小心。
答案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`