2015-11-05 122 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