2015-11-05 71 views
0

我有一个脚本,在后台运行,并有一堆循环中检查的东西,并根据这些检查做的事情。因为现在我有一个大的主循环,每60秒运行一次,小循环不断执行一组命令,休眠一段时间,然后再循环。 Interval变量以秒为单位,但可以更改为分钟或小时。Bash比较时间使用日期

,因为它是现在的代码:

Small_Loop() { 
    while :; do 
     do things 
     sleep $Interval 
    done 
} 
Main_Loop() { 
    while :; do 
     test stuff and call functions based on those tests 
     sleep 60 
    done 
} 

所有小循环被调用后与他们“&”,最后的主回路被正常调用。由于这真的很难看,而且资源很重,我怎么能用日期比较来做到这一点?

它会得到军事格式的时间,12:00,加上间隔(如果间隔时间是一个小时,它会是13:00),Main_Loop可以简单地比较它们,直到它循环需要做点什么。

事情是这样的:

Update_Interval() { 
    #get the new interval in **:** format 
} 

Main_Loop() { 
    while :; do 
     if [ "`date +%R`" = "$Interval" ]; then 
      #do the Small_Loop's job 
     fi 
     Update_Interval 
    done 
} 

所以我想真正的问题是:如何使用日期比较来运行命令块每一个设定的时间间隔。

我发现我可以使用手表,但是可以在脚本内部使用它,而不会干扰它?

+0

只需使用'cron'代替?除非需要“脚本运行时间”+间隔而不是间隔间隔。 –

+0

为什么不使用cron?让cron按要求的时间间隔执行脚本。 – Jake

+0

我不确定cron是否可以在所有的Android设备上使用,因此无法使用它,不过谢谢你的建议:) – BonBon

回答

1

我不会使用“+%R”作为简单地使用“+%s”会简单得多。

prevtime=`date +%s` 
currtime=0 

#Interval in which the block is executed 
interval=5 

#The block to execute 
function block() { 
    echo -e "\a" #plays a beep noise 
} 

function main() { 
    clear 
    echo "Running..." 
    sleep 0.1 

    currtime=`date +%s` 
    if [ $currtime -eq $((prevtime+interval)) ]; then 
     block 
     prevtime=$currtime 
    fi 
} 

while :; do main; done 

命令“date +%s”返回“自1970-01-01 00:00:00 UTC以来的秒数”的量。这意味着你的电话号码总是以秒为单位,时间的变化将永远是对未来的正数,对过去是负数。所以你真正需要做的是检查数量有多少变化。如果它已经改变了5,你知道已经过了5秒。

如果您想要更精确的计时,您还可以使用“+%s%N”计算出有多少纳秒已经过去,而不是秒。

只要代码块可以在间隔时间内执行,就不必运行任何后台进程。如果间隔时间在您的情况下为60秒,并且代码块需要65秒才能执行,那么它将不会执行下一个间隔的代码块。

正如其他人所指出的,您也可以使用cron

+0

感谢您为我指出这一点!间隔时间可以从几小时到几天不等,所以这实际上比我想到的原始方法更加方便。 这个想法是,这个脚本同时做多件事情,所以代码块总是在后台执行。 – BonBon