我有一个运行 Raspbian(Debian 衍生版本)的 Raspberry Pi,用于记录实时温度。作为其中的一部分,我需要一个精确到几秒钟的时钟。在服务器启动时的正常操作中,我知道 Raspberry Pi 会定期通过网络连接到 NTP 服务器,以确保其本地时钟相当接近正确时间。这种准确度对于我的应用来说已经足够了。 Raspberry Pi 没有电池供电的时钟来在服务器关闭或断电时保持时间,因此首次启动时系统时间不正确,直到建立互联网连接并通过 NTP 获取正确的时间。
我发现的一个问题是,当停电时,Raspberry Pi 会关闭一段时间而没有通电,然后稍后(例如 30 分钟)又恢复供电。 Pi 启动,我的应用程序启动并再次开始记录温度,但 Pi 上的时钟不正确,因此它记录的温度具有错误的时间戳。它似乎以某种方式保存了最后一个已知时间并从那里开始(重新启动时它不会重置为纪元时间)。最终,当 Pi 所在的 LAN 恢复并重新获得互联网连接时,Pi 将纠正其时间(通过 NTP),但在此之前,我记录的时间戳不准确。
我想找出解决这个问题的最佳行动方案是什么?
出于维护原因,我宁愿不添加电池供电的附加时钟(不希望任何人必须更换电池,因为这本质上是嵌入式设备,用户不易访问)。
我愿意让我的应用程序推迟记录温度,直到我知道已从网络准确检索到时间,但我什至不知道如何检测该状态。有人知道如何知道时间何时从 NTP 服务器更新并且现在是正确的吗?
我的应用程序是通过在启动时运行脚本来启动的。
关于如何解决这个问题还有其他想法吗?
答案1
每次你重新启动你的树莓派(这需要几秒钟的时间),你的时钟将会关闭超过ntp
通过延长/缩短时间(即旋转,这仅适用于校正仅稍微偏离,例如由于实时时钟每天慢或快一秒左右而引起的),ntp
必须设置时钟。
因此,最简单的可能是使用一个脚本来启动温度测量程序的首次调用ntpdate
或等效程序,该脚本根据检索到的值的距离设置日期或回转。ntpdate
因此,如果时钟已经设置为接近正确,ntp
例如如果您通过此脚本重新启动而无需重新启动,则不会中断事情。
答案2
查看ntp-wait
NTP 附带的程序。您运行它,它会等待您的时钟同步,然后退出。 (或者它最终放弃,并因错误退出。)您可以使用它来阻止脚本启动,直到时钟同步为止。
您还可以运行类似ntpq -p
or 的命令ntpq -c rv
并解析输出以检查时钟的状态。事实上,ntp-wait
一个简短的 Perl 脚本正是这样做的。
答案3
另一种选择可能是解析 的输出ntpq -c peers
以观察层是否远离 16。
答案4
您的 NTP 客户端也是一个 NTP 服务器,它可以向客户端报告其当前状态。
我实际上是在使用chrony
而不是ntpd
在我的盒子上,当我询问它的当前状态时,它说:
[axa@enyo ~]$ chronyc tracking
Reference ID : p.q.s.t (xxx.yyy.zzz)
Stratum : 4
Ref time (UTC) : Sun May 31 22:35:34 2015
System time : 0.000630264 seconds slow of NTP time
Last offset : +0.000047504 seconds
RMS offset : 0.023269517 seconds
Frequency : 6.462 ppm slow
Residual freq : -0.023 ppm
Skew : 0.225 ppm
Root delay : 0.031594 seconds
Root dispersion : 0.025155 seconds
Update interval : 1035.3 seconds
Leap status : Normal
从“系统时间”字段,您的进程可以确定时钟是否足够准确。我很确定您可以直接读取这些值,而无需解析供人类使用的命令的输出,但我不知道详细信息。