首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式检测时间同步事件

以编程方式检测时间同步事件
EN

Server Fault用户
提问于 2020-11-23 12:20:20
回答 1查看 1.2K关注 0票数 0

我正在开发一个传感器系统,它运行在嵌入式Linux平台上,无法访问互联网。连接外部GPS时间服务器设备,以使用时间守护进程提供时间同步。

我的c++应用程序以50 is读取测量值,并带有相关的时间戳,但是,我希望在数据中设置一个标志,以报告系统时间是否正确。

通过命令行,timedatectl可用于报告"NTP同步“状态。

代码语言:javascript
复制
:~$ timedatectl
      Local time: Wed 2020-08-19 17:03:01 BST
  Universal time: Wed 2020-08-19 16:03:01 UTC
        RTC time: Wed 2020-08-19 16:03:01
       Time zone: Europe/London (BST, +0100)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

而时间守护进程的状态将报告系统时钟调整(请注意,大时间调整是由某些为测试目的设置的假日期引起的)。

代码语言:javascript
复制
sudo systemctl status chrony
● chrony.service - LSB: Controls chronyd NTP time daemon
   Loaded: loaded (/etc/init.d/chrony; bad; vendor preset: enabled)
   Active: active (running) since Mon 2006-10-02 18:00:28 BST; 13 years 10 months ago
     Docs: man:systemd-sysv-generator(8)
  Process: 3201 ExecStop=/etc/init.d/chrony stop (code=exited, status=0/SUCCESS)
  Process: 3240 ExecStart=/etc/init.d/chrony start (code=exited, status=0/SUCCESS)
    Tasks: 1
   Memory: 340.0K
      CPU: 90ms
   CGroup: /system.slice/chrony.service
           └─3247 /usr/sbin/chronyd

Oct 02 18:00:26 systemd[1]: Starting LSB: Controls chronyd NTP time daemon...
Oct 02 18:00:26 chronyd[3247]: chronyd version 2.1.1 starting (+CMDMON +NTP +REFCLOCK +RTC +PR
Oct 02 18:00:26 chronyd[3247]: Frequency -5.049 +/- 2.705 ppm read from /var/lib/chrony/chrony
Oct 02 18:00:28 chrony[3240]: chronyd is running and online.
Oct 02 18:00:28 systemd[1]: Started LSB: Controls chronyd NTP time daemon.
Oct 02 18:00:30 chronyd[3247]: Selected source 10.10.11.20
Oct 02 18:00:30 chronyd[3247]: System clock wrong by 438114471.141858 seconds, adjustment star
Aug 20 12:28:21 chronyd[3247]: System clock was stepped by 438114471.141858 seconds

当然,这些命令可以通过眼睛观察,并且可以将报告的时间与预期的预期时间进行比较,但是我希望我的软件应用程序确定报告的时间是正确的。

因此,我想知道如何以编程方式检测当前时间是否是同步的,以及理想情况下如何检测最后一次同步调整。

编辑:我只是想要能够检测当前时间是否在我的c++应用程序中同步。我有一个外部同步源,因此我想知道这是否是可操作的,并提供同步,这样我就可以在数据中报告与数据相关的时间戳是否已经同步。我的软件应用程序运行的系统将在一艘没有互联网接入的船上使用。

EN

回答 1

Server Fault用户

发布于 2020-11-23 16:50:55

4.38亿秒抵消是13年。如果这个系统有一个实时时钟,检查它的功能。

在系统启动时,决定是否希望在启动应用程序之前等待NTP被同步。在RHEL上,您的单元可以依赖于chrony-wait.service。它的实现利用了chronyc waitsync

典型的NTP度量是可访问对等点的数量,以及该系统的偏移量。有关解析chronycntpq二进制文件输出的实现,请参见D3

内核时间规则是一种频繁且渐进的事情,chrony将经常调用ntp_adjtime()

也许您希望检测到像这一段时间记录的大步骤?拥有一个电子邮件回拨,mailonchange指令。它调用sendmail,因此您可以处理该邮件,或者放置其他脚本。

有一些方法可以从C程序中检测到这些信息。自己打电话给ntp_adjtime(),检测出TIME_ERROR的返回是个问题。或者在Linux上,用timerfd_settime设置一个长时间运行的计时器,并提供TFD_TIMER_CANCEL_ON_SET标志。这有一个巧妙的技巧,如果时钟是步进或其他有一个不连续的变化被取消。

票数 3
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1043583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档