我有一个在后台运行的脚本,其中有一堆循环,用于检查内容并根据这些检查执行操作。就像现在一样,我有一个每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
}
所以我想真正的问题是:如何使用日期比较在每个设置间隔运行一个命令块。
我发现我可以使用手表,但是这可以在脚本中使用而不会干扰它吗?
答案 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。