2011-11-17 59 views
4

我想以一個小時隨機間隔打開和關閉一些網頁。如何在bash/linux腳本中執行相同的循環1小時?

到目前爲止,我已經寫了內臟

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。什麼是隨機數的命令?

+1

爲了得到一個隨機數,使用'$ RANDOM' –

回答

13

肯定。嘗試:

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

date +%s顯示秒當前時間自1970年以來,循環計算一個小時的當前日期前並檢查它是否超出了啓動時間。你可以這樣做

+0

不說只給真正當其究竟1H以後呢? – Frost

+0

'人測試'說-lt表示「小於」。 – thiton

+0

ahh ofc:P謝謝 – Frost

9

一種方法是用信號和陷阱。這裏有一個簡單的例子:

#!/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,但是我已經包含了它的完整性,因爲您可以將它用作鉤子來完成其他事情(例如if你不想死,而是設置一個標誌,讓循環自然終止,或者在終止之前做一些清理工作)。

2

這是我的解決方案:

#!/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 
+0

這對我來說聽起來有點複雜'while kill&>/dev/null -0 $ _suicide_pid; do'。你能指出我的任何文件解釋嗎? '-0'是什麼意思? – erm3nda

+0

'kill -0'只是一個測試PID是否存在的測試。 * –

相關問題