Shell脚本中的时间计数器

时间:2011-04-09 11:30:42

标签: bash shell

我希望每2秒执行一次命令,并在while循环中每5秒执行一次命令。

start
while [ 1 ]
do
if [ time diff == 2]
   do sth
fi 
if [ time diff == 5]
   do sth else
fi
end
dif = end - start

但是当差异为0时,这是一个小问题。 我怎样才能在shell脚本中做到这一点?

6 个答案:

答案 0 :(得分:5)

试试这个:

while true; do sth ; sleep 2 ; done

您可以使用子shell:

#!/bin/bash

(while true ; do echo time2 ; sleep 2 ; done)&
(while true ; do echo time5 ; sleep 5 ; done)

但是,您将不得不做一些事情来杀死后面的子shell。

答案 1 :(得分:0)

尝试sleep

while true
do
  ..
  sleep 2
done

答案 2 :(得分:0)

可能最简单的方法是像这样的10秒循环! (因为10是2和5的最小公分)

while true
do
    sth
    sleep 2
    sth
    sleep 1
    sth else
    sleep 1
    sth
    sleep 2
    sth
    sleep 2
    sth
    sth else
    sleep 2
done

虽然有点疯狂!

当然,这假设命令是即时的,您可能希望使用&

对它们进行后台处理

答案 3 :(得分:0)

#!/bin/bash
#
rhythm () {

    beat1=$1
    beat2=$2
    tick=0
    while [ 1 ]
    do
        (( tick % $beat1)) || echo a
        (( tick % $beat2)) || echo b
        tick=$(((tick+1)%(beat1*beat2)))
        sleep 1
    done 
}

rhythm 2 5 

当然,这只适用于2个参数,如果示例中的echo消耗的时间/真实命令中的实际命令是无关紧要的。

答案 4 :(得分:0)

如果您想要非常彻底,可以将此作为起点

#!/bin/bash

declare -a JOBPIDS

function repeatbackground()
{
    local delay="$1"
    shift
    (
        while true
        do
            sleep "$delay" || return 0 # abort on sleep interrupted
            eval "$@"
        done
    )&
    JOBPIDS=( ${JOBPIDS[@]-} $! )
}

function signalbackgroundtasks()
{
    for bgpid in "${JOBPIDS[@]}"
    do
        kill -TERM "$bgpid" || echo "Job $bgpid already vanished"
    done
    JOBPIDS=( )
}

trap "signalbackgroundtasks; exit 0" EXIT
repeatbackground 2 echo "by the other way"
repeatbackground 5 echo the other background job

echo "Running background jobs ${JOBPIDS[@]}"
wait
exit 0

答案 5 :(得分:0)

以下内容不使用特定于bash的功能或子shell,并且很容易概括:

set 1 2 3 4 5
while :; do
  sleep 1
  shift  
  case $1 in
    2|4) echo "every 2 seconds" ;;
    5)   echo "every 5 seconds" ; set 1 2 3 4 5 ;;
  esac
done