Счетчик времени в скрипте оболочки - PullRequest
0 голосов
/ 09 апреля 2011

Я хочу выполнять команду каждые 2 секунды, а другую - каждые 5 секунд в цикле while.

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

Но это маленькая проблема, когда разница равна 0. Как я могу сделать подобное в сценарии оболочки?

Ответы [ 6 ]

5 голосов
/ 09 апреля 2011

Попробуйте:

while true; do sth ; sleep 2 ; done

Вы можете использовать подоболочку:

#!/bin/bash

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

Однако позже вам придется что-то сделать, чтобы убить фоновую оболочку.

0 голосов
/ 09 апреля 2011

Следующее не использует специфичные для bash функции или подоболочки и легко обобщается:

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  
0 голосов
/ 09 апреля 2011

Если вы хотите быть очень очень тщательным, вы можете использовать это в качестве отправной точки

#!/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
0 голосов
/ 09 апреля 2011
#!/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-х параметров, и если время, затраченное на эхо в примере / реальной команде в реальном, незначительно.

0 голосов
/ 09 апреля 2011

возможно, самый простой подход - это 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

Хотя это немного сумасшествие!

Конечно, это предполагает, что команды являются мгновенными, вы можете задеть их&

0 голосов
/ 09 апреля 2011

попробуй sleep

while true
do
  ..
  sleep 2
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...