我需要创建一个应用程序来验证每台计算机上的NTP时间同步。换句话说,我需要确定每台机器是否是我的局域网同步到公共时间服务器(层)。所以,到目前为止,我想出了两种方法。
1) 让每台计算机上的 NTP 客户端生成统计信息文件。如果采用此方法,我应该检查哪个统计信息文件以确定计算机上的时间是否在时间服务器的某个容差范围内?有一个peerstats,clockstats和loopstats。这些文件是否包含可用于确定时间是否已同步的信息?
2) 调用 ntpq 命令行参数并管道传输其输出。分析输出。
现在我更喜欢选项 1,但是,正如我所指出的,我不确定是否有任何 NTP 统计文件包含可用于确定时间是否同步的信息。
有没有更好的方法。
是否有可用于直接查询 NTP 客户端的 API?
感谢您的帮助。
您可以运行ntpq -c "rv 0 stratum,offset"
命令并解析输出。如果返回stratum
为 <16,则offset
ntp 池与系统时钟之间的时间差(以毫秒为单位)。
还有一个libntpq
库正在开发中。它处于早期测试版中,但如果你非常需要一些东西,它应该是可用的。
更新 2016-10-07:看起来libntpq
项目早已失效,但源代码中包含具有相同名称ntp
库。它看起来可用,但很可能需要静态链接。人们应该能够容忍GPL,以便以这种方式使用它。
验证同步的最佳方法是实际验证同步,而不是查看由您正在检查其工作的守护程序生成的文件。 应运行ntpdate -q
或等效值,并验证报告的偏移是否在所需的任何容差范围内。
我有同样的问题。我一直在使用两个命令的组合: ntptime [然后解析输出以确认没有出现单词"ERROR"] ntpq -p [然后确认它返回非错误状态,以及至少一个"+"符号来指示同步状态]
这在我的 CentOS 盒子上效果很好, 但是在我的 FreeBSD 服务器上, 只要本地时间稳定, ntpd 正在运行, 并且时间源服务器返回一致的时间, 它就会返回"OK"状态,即使它不同步几个小时。我欢迎一个更好的答案。使用ntpdate的建议可能会起作用,如果我可以操纵一些东西来使ntpdate使用ntp.conf来获取时间源服务器的列表。
我认为两者都会输出良好的结果,如果您真的想每隔几分钟监控一次时间,那么选择第二个选项,唯一的区别......ntpq 有多种选项来监控您的整个 Ntp 同步过程......ntpq>pe 将为您提供所有已配置对等体的状态,ntpq>as 将提供有关每个对等方的所有其他详细信息,ntpq>rv 将提供有关每个对等体的完整概要......还有其他内部命令可以通过 ntpq 调试 ntp 进程。如果您需要更多说明,值得浏览以下页面:http://doc.ntp.org/4.1.1/ntpq.htm
对于您的第一个选项,它是一个统计报告,您可以将其保留在 ntp 上,以便根据 ntp.conf 文件中提到的继续生成和更新,即您是否希望每天或每周生成它等......
Loopstats将显示日期,时间,频率和时间偏移,抖动,时钟纪律时间常数等。对等统计将通知您所有存在和配置的对等方时钟统计将通知时钟驱动程序状态
除此之外,还有原始统计和系统统计选项也可用,您也可以检查您的系统日志并通过 ntp.conf 文件将它们重定向到您自己的 Ntp 日志
您可以浏览上述链接中的监视部分,并可以了解有关如何配置 NTPstats 的更多详细信息
希望这可能会对你有所帮助!!
如果您只需要确定计算机是否同步,则可以使用 ntpstat
。
SYNOPSIS
ntpstat
DESCRIPTION
ntpstat will report the synchronisation state of the NTP daemon
running on the local machine. If the local system is found to be
synchronised to a reference time source, ntpstat will report the
approximate time accuracy.
RETURNS
ntpstat returns 0 if clock is synchronised.
ntpstat returns 1 if clock is not synchronised.
ntpstat returns 2 if clock state is indeterminant,
for example if ntpd is not contactable.