【问题标题】:How to do incremental time leap to avoid data loss如何进行增量时间跳跃以避免数据丢失
【发布时间】:2016-04-04 03:47:35
【问题描述】:

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

问题: 几年后,RTC 偏离了实际时间,一些 SBC 与实际时间延迟了 1 小时以上(更慢)。

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

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

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

问题:

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

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

【问题讨论】:

  • 使用您的脚本,您离实时有多近?您是否也看过这个 (support.ntp.org/bin/view/Dev/DeprecatingNtpdate) 页面 - 特别是 ntpd -x 这可能会有所帮助。
  • @user3788685,您好,感谢您的建议。 ( - 我的脚本可以实时接近多少?) Ans : 我的脚本每 7.5 分钟(450 秒)增加 7 秒,它会这样做,直到 NTP 服务器返回的偏移量小于 7 并且将与实际时间。所以,要回答这个问题,我想它非常接近(~1 秒容差)(-关于 ntpd -x) 回答:是的,但它似乎不适用于我现在正在运行的 busybox 版本。还是我的语法错误?
  • Busybox 在我几年前尝试时总是有点缺乏 - 它没有构建/工作所有东西。我的想法是,如果您的脚本让您足够接近而不会跳到您,然后启用 ntpd 以在无需运行脚本的情况下检查事情(或者我在这里遗漏了什么)

标签: linux bash ntp busybox ntpd


【解决方案1】:

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

解决方案 1

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

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

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

!/bin/sh

pid=pidof NTP_Update

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


希望这种变通方法能帮助任何在旧的busybox版本上苦苦挣扎的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多