Bash使用日期比较时间

时间:2015-11-05 14:34:17

标签: bash date

我有一个在后台运行的脚本,其中有一堆循环,用于检查内容并根据这些检查执行操作。就像现在一样,我有一个每60秒运行一次的主循环和较小的循环,它们不断地执行一组命令,休眠一段时间然后再循环。 Interval变量以秒为单位,但可以更改为分钟或小时。

现在的代码:

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,将间隔添加到该区间,(因此,如果间隔为1小时,则为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
}

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

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

1 个答案:

答案 0 :(得分:0)

我不会使用" +%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

命令"日期+%s"返回自1970-01-01 00:00:00 UTC"以来的"秒数。这意味着您的号码将始终以秒为单位,时间的变化将始终是未来的正数和过去的负数。所以你真正需要做的就是检查数量的变化。如果它改变了5,你知道已经过了5秒。

如果您想要更精确的计时,您还可以使用" +%s%N"来计算过去的纳秒数而不是秒数。

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

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