如何进行增量时间跳跃以避免数据丢失

时间:2016-04-04 03:47:36

标签: linux bash ntp busybox ntpd

背景: 嗨,我目前正在使用旧的Linux SBC系统。它使用BusyBox v1.00-rc2,它很旧并且功能有限。 (不,升级不是一种选择)。这个SBC连接了几个传感器,记录了它的价值和时间。

问题: 几年后,RTC从实际​​时间开始漂移,部分SBC从实际时间延迟超过1小时(较慢)。

我不能简单地使用ntp服务器执行ntpdate,因为它会导致时间跳转并导致数据监控日志出现巨大差距。这是不可接受的。

解决方案: 我创建了一个bash脚本:

  1. 使用SBC和ntp服务器检查ntp偏移量
  2. 然后,在变量
  3. 中记录偏移量
  4. 如果偏移值大于7,例如(60秒偏移),脚本将使用 date -s 命令逐渐增加系统时钟。
  5. 每小时最多只会增加60秒
  6. 示例:
    • SBC时间是2016年4月4日14:59:00
    • 来自ntp服务器的实际时间是2016年4月4日15:00:00
    • 如果我使用 ntpdate -q -4 utcnist2.colorado.edu ,则会返回 60秒偏移量
    • 因此,我的脚本每450秒只会增加 7秒
    • 有了这个逻辑,SBC时间将在4月左右的时间内赶上ntp时间 2016年第4期16:04:17
    • 问题是,此脚本设法逐步慢慢调整时间,有时,它会变得混乱,SBC时间会比实际时间(Ntp时间),这将导致数据丢失(如果SBC时间比服务器时间快,服务器将不接受。)
  7. 问题:

    • 有没有其他方法可以进行类似于此的增量时间跳转?
    • 我注意到ntpdate有-B函数可以进行增量时间更新,但我没能在SBC上使用它。使用此开关的正确方法是什么?或者我误解了它的功能?
    • adjtimex可以达到这个目的吗?
    • 如果你们有人需要它(这里要粘贴太长时间),这是我完整的bash脚本,
      

    http://pasted.co/65beb3db [密码:123456]

1 个答案:

答案 0 :(得分:0)

关于这件事我已经得出结论。有两个解决方案(根据我的经验。也许更多。随意添加):

解决方案1 ​​

  • 来源:http://www.ep.ph.bham.ac.uk/general/support/adjtimex.html
  • 方法:更改linux滴答计数和频率。所有计算都可以在javascript中通过 L.S.Lowe在bham.ac.uk (在链接中)看到
  • 示例:如果我想将系统时钟加速每小时加快60秒,我需要更改(tick = 10167)(频率= -2184533)< / em>并使用 adjtimex -t 10167 -f -2184533
  • 应用它

解决方案2 (我现在使用的是什么)

  • 在我上面的问题中,我已经提到我使用旧版本的busybox,我不能使用许多最新的功能,如 ps -anySwitch 来获取当前运行进程的pid 。 Pidof myscript.sh 命令也没有产生任何结果。
  • 所以,在我上面的bash脚本中,我在脚本之上创建了一个函数,这样每次我的脚本以cron开始,每15分钟一次,我的脚本将检查存储在文件中的pid。如果pid仍在运行,则新脚本将自行终止。这是为了避免每15分钟运行多个脚本。
  • 我怀疑,这种方法存在一些缺陷。出于某种原因,脚本将运行多次,并导致时间增量变得更快(因为有多个脚本在运行)
  • 因此,为了避免这种怀疑,我不是每15分钟运行一次脚本,而是修改了cron以运行另一个脚本来检查我的脚本是否正在运行。
  • 我发现如果我使用这种方法启动我的脚本 - &gt; ./ myScript ,我可以使用 pidof myscript获取pid号
  • 因此,使用此方法并避免任何灰色区域将非常有把握。
  • 直到现在,似乎我已经解决了我的问题。
  • Launcher Script示例:
  

!/ bin / sh的

     

PID = pidof NTP_Update

     

if [-n“$ pid”];然后回显“NTP_Update正在运行......”否则回声   “NTP_Update未运行...”cd / root / script ./NTP_Update fi

希望这个方法可以帮助任何与旧的busybox版本挣扎的人。