Как выполнить тот же цикл в течение 1 часа в сценариях bash / linux? - PullRequest
4 голосов
/ 17 ноября 2011

Я хочу открывать и закрывать некоторые веб-страницы со случайными интервалами в течение часа.

До сих пор я написал внутренности

FILE=webpages
TIMES=0
while test $TIMES -lt 10
do
    #Picks random line(Website) from FILE
    TEMPWEB=`shuf -n 1 $FILE`
    echo "Opening" $TEMPWEB
    #Opens TEMPWEB
    xdg-open $TEMPWEB
    sleep 10
    #Kills firefox
    ps -e | grep firefox | sed 's/\(.[0-9]*\).*/\1/' | xargs kill
    TIMES=$(($TIMES+1))
done

Так что мне не хватает условия while.
Я хочу что-то вроде:

TIMER = 0h 0m 0s
while( TIMER < 1 h)
   ....
done

Возможно ли это?

PS.что за команда на случайное число?

Ответы [ 3 ]

13 голосов
/ 17 ноября 2011

Конечно.Попробуйте:

#!/bin/bash
START=`date +%s`
while [ $(( $(date +%s) - 3600 )) -lt $START ]; do
    ....
done

date +%s показывает текущее время в секундах с 1970 года. Цикл вычисляет текущую дату часа назад и проверяет, превышает ли она время начала.

9 голосов
/ 17 ноября 2011

Один из способов сделать это - с помощью сигналов и ловушек.Вот простой пример:

#!/bin/bash

me=$$

# Start a background process to signal us when the time has passed
(
        sleep 10
        kill -USR1 $me
) &

# When we recieve SIGUSR1, commit suicide
trap "kill $me" SIGUSR1

# Do stuff until we commit suicide
while [ 1 -eq 1 ]
do
        echo 'Hello!'
        sleep 1
done

Комментарии не требуют пояснений (я надеюсь).Первая часть запускает фоновый процесс, который просто спит в течение некоторого периода времени (в данном примере 10 секунд), а затем, когда он просыпается, отправляет SIGUSR1 исходному процессу.

Shellscript перехватывает это (с помощью trap) и просто выдает kill для своего собственного PID, останавливая процесс.

В остальном это просто бесконечный цикл - это trap, который убивает скрипт и завершает цикл.

Технически вам не нужна ловушка в приведенном выше примере: фоновый процесс может просто выдать kill $me напрямую, но я включил его для полноты, так как вы можете использовать его как ловушку для других вещей(например, если вы не хотите умирать, а устанавливаете флаг и хотите, чтобы цикл завершился естественным образом, или вам нужно выполнить очистку перед завершением).

2 голосов
/ 18 ноября 2011

Это мое решение:

#!/bin/bash

# function to display a number in a range
randrange() { echo $(( ( RANDOM % ($2 - $1 +1 ) ) + $1 )); }

# sleep 1 hour and keep backgrounded PID in a variable
sleep 3600 & _suicide_pid=$!

# while the process is UP
while kill &>/dev/null -0 $_suicide_pid; do
    # ----->8--- do what you want here <---8<-----
    sleep $(randrange 10 15) # random sleep in 10-15 range
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...