4

背景: 嗨,我目前正在使用旧的 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时间为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 月 4 日 16:04:17左右赶上 ntp 时间
    • 问题是,这个脚本会一步一步慢慢调整时间,有时会出问题,SBC时间会比实际时间(Ntp时间)更快,这会导致数据丢失(服务器不会如果 SBC 时间快于服务器时间,则接受)。

问题 :

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

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

4

1 回答 1

0

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

解决方案 1

  • 资料来源:http ://www.ep.ph.bham.ac.uk/general/support/adjtimex.html
  • 方法:更改 linux 滴答计数和频率。所有计算都可以在LSLowe 在 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" ] ; 然后 echo "NTP_Update 正在运行..." else echo "NTP_Update not running..." cd /root/script ./NTP_Update fi


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

于 2016-04-14T01:36:55.113 回答