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

标签 linux bash ntp busybox ntpd

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

问题: 几年后,RTC 与实际时间发生漂移,一些 SBC 与实际时间延迟超过 1 小时(较慢)。

我不能简单地用 ntp 服务器做 ntpdate,因为它会导致时间跳跃,并导致数据监控日志出现巨大差距。这是 Not Acceptable 。

解决方案: 我创建了一个 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 秒偏移量
    • 所以,我的脚本只会增加每 450 秒 7 秒
    • 按照这个逻辑,SBC 时间将在 2016 年 4 月左右 catch ntp 时间4th 16:04:17
    • 问题是,这个脚本设法逐步缓慢地调整时间,但是有时,它会失控并且 SBC 时间会比实际时间(Ntp 时间),这将导致数据丢失(如果 SBC 时间比服务器时间快,服务器将不接受)。

问题:

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

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

最佳答案

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

解决方案一

  • 来源: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

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


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

关于linux - 如何进行增量时间跳跃以避免数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36394264/

相关文章:

LINUX CP : I need to copy all files from one directory to another without copying any sub-directories

linux - 如何在linux ubuntu服务器中打开特定端口

linux - Bash 脚本水印所有 .jpeg 没有缩略图

c - 确定 (S)NTP 数据包的目标时间戳?

ios - 如果设备日期和时间不准确,如何获取实际日期和时间?

linux - 即使使用 sudo 也拒绝权限

linux - 使此代码从文件中读取

linux - 自定义 bash 完成的提示

Rscript 和反引号

javascript - 通过 JavaScript 与 NTP 同步时间的精度很高