如何进行增量时间跳跃以避免数据丢失
How to do incremental time leap to avoid data loss
背景:
您好,我目前正在使用旧的 Linux SBC 系统。它使用旧的且功能有限的 BusyBox v1.00-rc2。 (不,升级不是一种选择)。此 SBC 连接了多个传感器,记录值和时间戳。
问题:
几年后,RTC 偏离实际时间,部分 SBC 延迟超过 1 小时(较慢)。
我不能简单地用ntp服务器做ntpdate,因为它会导致时间跳跃并在数据监控日志上造成巨大的差距。这是不可接受的。
解法:
我创建了一个 bash 脚本,它将:
- 检查 SBC 和 ntp 服务器的 ntp 偏移量
- 然后,将偏移量记录在一个变量中
- 如果偏移值大于 7,例如(60 秒偏移),脚本将增加系统时钟,一点一点地使用 date -s命令。
- 每小时最多只会增加60秒
- 示例:
- 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 时间比服务器时间快,服务器将不会接受)。
问题:
- 有没有其他类似的增量时间跳跃的方法?
- 我注意到 ntpdate 有 -B 功能,可以进行增量时间更新,但我没有在 SBC 上使用它。使用此开关的正确方法是什么?还是我误解了它的功能?
- adjtimex可以达到这个目的吗?
- 这是我完整的 bash 脚本,如果你们需要的话(太长无法粘贴到这里),
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 上苦苦挣扎的人。
背景: 您好,我目前正在使用旧的 Linux SBC 系统。它使用旧的且功能有限的 BusyBox v1.00-rc2。 (不,升级不是一种选择)。此 SBC 连接了多个传感器,记录值和时间戳。
问题: 几年后,RTC 偏离实际时间,部分 SBC 延迟超过 1 小时(较慢)。
我不能简单地用ntp服务器做ntpdate,因为它会导致时间跳跃并在数据监控日志上造成巨大的差距。这是不可接受的。
解法: 我创建了一个 bash 脚本,它将:
- 检查 SBC 和 ntp 服务器的 ntp 偏移量
- 然后,将偏移量记录在一个变量中
- 如果偏移值大于 7,例如(60 秒偏移),脚本将增加系统时钟,一点一点地使用 date -s命令。
- 每小时最多只会增加60秒
- 示例:
- 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 时间比服务器时间快,服务器将不会接受)。
问题:
- 有没有其他类似的增量时间跳跃的方法?
- 我注意到 ntpdate 有 -B 功能,可以进行增量时间更新,但我没有在 SBC 上使用它。使用此开关的正确方法是什么?还是我误解了它的功能?
- adjtimex可以达到这个目的吗?
- 这是我完整的 bash 脚本,如果你们需要的话(太长无法粘贴到这里),
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 上苦苦挣扎的人。