背景: 您好,我目前正在使用旧的 Linux SBC 系统。它使用旧的且功能有限的 BusyBox v1.00-rc2。 (不,升级不是一种选择)。这个 SBC 连接了几个传感器,记录值和时间戳。
问题: 几年后,RTC 与实际时间发生漂移,一些 SBC 与实际时间延迟超过 1 小时(较慢)。
我不能简单地用 ntp 服务器做 ntpdate,因为它会导致时间跳跃,并导致数据监控日志出现巨大差距。这是 Not Acceptable 。
解决方案: 我创建了一个 bash 脚本,它将:
- 检查 SBC 和 ntp 服务器的 ntp 偏移量
- 然后,将偏移量记录在一个变量中
- 如果偏移值大于 7,例如(60 秒偏移),脚本将增加系统时钟,使用 date -s 命令逐渐增加。
- 每小时最多只会增加60秒
- 例子:
- 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/