Shell脚本每5秒运行一次命令,持续x秒

时间:2016-11-10 19:59:44

标签: bash shell sh

我正在学习bash脚本,我想每隔5秒调用一次函数x秒。运行脚本时,x由命令行参数确定。我已经尝试过了,但它似乎永远持续下去,我似乎没有能力在x秒后返回。可能有一种睡眠方式,但它看起来很笨拙,我不得不处理局部漂移。有优雅的解决方案吗?

我的代码:

#!/bin/bash

if [ $# -ne 1 ]; then # only 1 command line arg allowed
   echo "Incorrect arguments"
   exit 1
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit
   echo "Argument must be a positive number"
   exit 1
fi

ask()
{
    OUTPUT=$(snmpwalk -v2c -c community server oib)
    CLEANOUTPUT="${OUTPUT:32}%"
    echo $CLEANOUTPUT
}

#export -f ask
#watch -n5 ask

3 个答案:

答案 0 :(得分:2)

SECONDS变量计算自bash启动以来的秒数:

#!/bin/bash

while (( SECONDS <= 20 ))
do
  echo "Running something"
  sleep 5 || break
done
echo "Done"

这个简单的方法在最后一次运行后sleep 5,即使你知道它超过20秒,也不会试图考虑命令的运行时间(如果命令运行的话) 2秒,它每7秒开始一次启动。

答案 1 :(得分:1)

如果你想要更准确一些时间,你可以将sleep放入后台,做任何需要的工作,然后使用wait,这将暂停前台处理,直到sleep退出。虽然准确性不会很完美,但至少不包括工作部分所花费的时间。

类似的东西:

#!/bin/bash

LOOPTIMES=3
REPEATEVERY=5   # seconds

for (( count=0 ; $count < $LOOPTIMES ; count++ ))
do
    /bin/sleep $REPEATEVERY &

    echo "Doing work $count..."
    # do whatever

    wait    # this will wait until the sleep exits
done

退出0

答案 2 :(得分:0)

#!/bin/bash
if [ $# -ne 1 ]; then # only 1 command line arg allowed
   echo "Incorrect arguments"
   exit 1
elif ! [[ $1 =~ ^[0-9]+$ ]]; then # arg must be digit
   echo "Argument must be a positive number"
   exit 1
fi

iterations=$(($1/5))
for i in $(seq 1 $iterations);
do
      OUTPUT=$(snmpwalk -v2c -c community server oib)
      CLEANOUTPUT="${OUTPUT:32}%"
      echo $CLEANOUTPUT
      sleep 5
done