背景:嗨,我目前正在使用旧的Linux SBC系统。 它使用BusyBox v1.00-rc2这是旧的,function有限。 (不,不能升级)。 这个SBC连接了几个传感器,logging下它的值和时间。
问题:几年之后,RTC从实际时间偏离,一些SBC从实际时间延迟超过1小时(较慢)。
我不能简单地使用ntp服务器执行ntpdate,因为它会导致时间跳跃,并导致数据监视日志上的巨大差距。 这是不能接受的。
解决scheme:我创build了一个bash脚本,它将:
- 用SBC和ntp服务器检查ntp偏移量
- 然后,在一个variables中logging偏移量
- 如果偏移值大于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月4日16:04:17左右ntp时间赶上
- 问题是,这个脚本设法慢慢地调整时间一步一步, 但有时,它会失控,SBC时间会比实际时间(Ntp时间)更快,这将导致数据丢失(服务器将接受如果SBC时间比服务器时间更快)。
问题:
- 有没有其他的方法来做类似于这个增量时间跳跃?
- 我注意到,ntpdate具有-Bfunction,将执行增量时间更新,但我没有在SBC上使用它。 什么是使用此开关的正确方法? 或者我误解了它的function?
- 可以adjtimex达到这个目的吗?
- 这里是我完整的bash脚本,如果你有任何需要它(太长时间粘贴在这里),
http://pasted.co/65beb3db [密码:123456]
我已经就这个问题得出了一个结论。 有2个解决方案(从我的经验,也许更多,随意添加):
解决方案1
- 资料来源: http : //www.ep.ph.bham.ac.uk/general/support/adjtimex.html
- 方法:更改linux的滴答计数和频率。 所有的计算都可以在LSLowe的bham.ac.uk里面看到(在链接中)
- 例如:如果我想把系统时钟加速到每小时60秒,我需要改变(tick = 10167)和(frequency = -2184533)并使用adjtimex -t 10167 -f -2184533
解决方案2 (我现在使用的是什么)
- 在我上面的问题中,我已经提到过,我使用的是旧版本的busybox,我不能使用许多最新的函数,比如ps -anySwitch来获取当前正在运行的进程的pid。 Pidof myscript.sh命令也没有产生任何结果。
- 所以,在我上面的bash脚本中,我在脚本的顶部创建了一个函数,以便每当我的脚本以每15分钟的cron开始时,我的脚本将检查存储在文件中的pid。 如果该pid仍在运行,则新脚本将自行终止。 这是为了避免每15分钟运行一次脚本。
- 我怀疑,这种方法存在一些缺陷。 出于某种原因,脚本将运行多次,并导致时间增量变得更快(因为有多个脚本运行)
- 因此,为了避免这种怀疑,我不是每15分钟运行脚本,而是修改了cron以运行另一个脚本来检查脚本是否正在运行。
- 我发现如果我使用这种方法启动脚本 – > ./myScript ,我可以使用pidof myscript
- 所以,这将是很大的保证,使用这种方法,并避免任何灰色地带。
- 到现在为止,似乎我已经解决了我的问题。
- 启动脚本示例:
!/ bin / sh的
pid = pidof NTP_Update
如果[-n“$ pid”]; 然后回声“NTP_Update正在运行…”否则回声“NTP_Update未运行…”cd / root / script ./NTP_Update fi
希望这个方法可以帮助任何一个正忙于旧的busybox版本的人。