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

How to do incremental time leap to avoid data loss

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

问题: 几年后,RTC 偏离实际时间,部分 SBC 延迟超过 1 小时(较慢)。

我不能简单地用ntp服务器做ntpdate,因为它会导致时间跳跃并在数据监控日志上造成巨大的差距。这是不可接受的。

解法: 我创建了一个 bash 脚本,它将:

  1. 检查 SBC 和 ntp 服务器的 ntp 偏移量
  2. 然后,将偏移量记录在一个变量中
  3. 如果偏移值大于 7,例如(60 秒偏移),脚本将增加系统时钟,一点一点地使用 date -s命令。
  4. 每小时最多只会增加60秒
  5. 示例:
    • SBC时间是14:59:002016年4月4日
    • 来自 ntp 服务器的实际时间是 15:00:00 2016 年 4 月 4 日
    • 如果我使用 ntpdate -q -4 utcnist2.colorado.edu 它将 return 与 60秒偏移量
    • 所以,我的脚本每450秒只会增加7秒
    • 按照这个逻辑,SBC时间会在4月4th 16:04:17 2016
    • 左右赶上ntp时间
    • 问题是,这个脚本设法一步一步地慢慢调整时间,但是有时,它会失控并且与实际时间(Ntp 时间)相比,SBC 时间会更快,这将导致数据丢失(如果 SBC 时间比服务器时间快,服务器将不会接受)。

问题:

http://pasted.co/65beb3db [password : 123456]

关于这件事我已经得出结论了。有2种解决方案(根据我的经验。也许更多。欢迎补充):

解决方案 1

  • 来源:http://www.ep.ph.bham.ac.uk/general/support/adjtimex.html
  • 方法:更改 linux 滴答计数和频率。 javascript by L.S.Lowe at bham.ac.uk(在link)
  • 示例:如果我想将系统时钟加速到每小时快 60 秒,我需要更改 (tick = 10167) (frequency = -2184533) 并使用 adjtimex -t 10167 -f -2184533
  • 应用它

解决方案2 (我现在正在使用的)

  • 在我上面的问题中,我已经提到我使用的是旧版本的 busybox,我无法使用许多最新功能,例如 ps -anySwitch获取当前 运行ning 进程的 pid。 Pidof myscript.sh 命令也没有产生任何结果。
  • 所以,在我上面的 bash 脚本中,我在脚本之上创建了一个函数,这样每次我的脚本通过 cron 启动时,即每 15 分钟一次,我的脚本将检查 pid 是存储在文件中。如果 pid 仍然是 运行ning,新脚本将自行终止。这是为了避免 运行ning 每 15 分钟出现多个脚本。
  • 我怀疑这个方法有一些缺陷。由于某些原因,脚本会运行多次,导致时间增量变快(因为有多个脚本运行ning)
  • 所以,为了避免这种怀疑,我将 cron 修改为 运行 另一个脚本来检查我的脚本是否 运行ning,而不是每 15 分钟 运行ning 脚本与否。
  • 我发现如果我使用此方法启动我的脚本-> ./myScript,我可以使用 pidof myscript[=52] 获取 pid 号=]
  • 所以,使用这种方法会更加放心,避免任何灰色地带。
  • 到现在为止,看来我的问题已经解决了。
  • 启动脚本示例:

!/bin/sh

pid=pidof NTP_Update

if [ -n "$pid" ] ; then echo "NTP_Update is running..." else echo "NTP_Update not running..." cd /root/script ./NTP_Update fi


希望这个变通方法能帮助那些在旧版 busybox 上苦苦挣扎的人。