Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何进行增量时间跳跃以避免数据丢失_Linux_Bash_Ntp_Busybox_Ntpd - Fatal编程技术网

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

Linux 如何进行增量时间跳跃以避免数据丢失,linux,bash,ntp,busybox,ntpd,Linux,Bash,Ntp,Busybox,Ntpd,背景: 您好,我目前正在使用一个旧的Linux SBC系统。它使用BusyBox v1.00-rc2,这是旧版本,功能有限。(不,升级不是选项)。该SBC与多个传感器连接,记录值并加盖时间戳 问题: 几年后,RTC偏离实际时间,一些SBC延迟超过实际时间1小时(较慢) 我不能简单地使用ntp服务器进行ntpdate,因为它会导致时间跳跃,并在数据监视日志上造成巨大的间隙。这是不可接受的 解决方案: 我创建了一个bash脚本,它将: 检查SBC和ntp服务器的ntp偏移 然后,在变量中记录偏移量

背景: 您好,我目前正在使用一个旧的Linux SBC系统。它使用BusyBox v1.00-rc2,这是旧版本,功能有限。(不,升级不是选项)。该SBC与多个传感器连接,记录值并加盖时间戳

问题: 几年后,RTC偏离实际时间,一些SBC延迟超过实际时间1小时(较慢)

我不能简单地使用ntp服务器进行ntpdate,因为它会导致时间跳跃,并在数据监视日志上造成巨大的间隙。这是不可接受的

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

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


    关于这件事,我已得出结论。有两种解决方案(根据我的经验,可能更多。请随意添加):

    解决方案1

    • 资料来源:
    • 方法:更改linux勾号计数和频率。所有计算都可以在javascript中通过bham.ac.uk上的L.S.Lowe查看(链接中)
    • 示例:如果我想将系统时钟加速到每小时快60秒,我需要更改(滴答=10167)和(频率=-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编号
    • 因此,使用这种方法并避免任何灰色区域将是非常有保证的
    • 直到现在,我似乎已经解决了我的问题
    • 启动程序脚本示例:
    !/垃圾箱/垃圾箱 pid=
    NTP\U更新的pid

    如果[-n“$pid”];然后回显“NTP_更新正在运行…”否则回显 “NTP_更新未运行…”cd/root/script./NTP_更新fi



    希望这个变通方法能帮助那些在旧busybox版本中苦苦挣扎的人。

    使用您的脚本,您离实时有多近?您也看过这个()页面了吗?特别是
    ntpd-x
    ,这可能会有所帮助。@user3788685,您好,谢谢您的建议。(-我的脚本与实时的距离有多近?)Ans:我的脚本将每7.5分钟(450秒)增加7秒,它将这样做,直到NTP服务器返回的偏移量小于7,并将与实际时间同步。所以,为了回答这个问题,我想它与ntpd-x非常接近(~1秒容差)(-关于ntpd-x)Ans:是的,但它似乎不适用于我现在运行的busybox版本。或者可能是我的语法错了?几年前我尝试Busybox时,它总是有点欠缺-它没有构建/运行所有功能。我的想法是,如果你的脚本让你离得足够近,而不是让你跳起来,那么就可以让ntpd在不需要运行脚本的情况下检查事情(或者我在这里遗漏了什么)