2014-09-21 41 views
-3

是否可以編寫一個腳本,該腳本直到給定的行出現在特定文件中才會繼續執行?如何等待,直到文件中出現一條特定的行

比如我想做的事情是這樣的:

CANARY_LINE='Server started' 
FILE='/var/logs/deployment.log' 

echo 'Waiting for server to start' 
.... watch $FILE for $CANARY_LINE ... 
echo 'Server started' 

基本上,一個shell腳本,手錶線(或正則表達式)的文件。

回答

-1

我們必須小心循環。

例如,如果你要檢查文件開始的算法你可能已經不得不做這樣的事情:

FILE_TO_CHECK="/var/logs/deployment.log" 
    LINE_TO_CONTAIN="Server started" 
    SLEEP_TIME=10 
    while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ] 
    do 
     sleep ${SLEEP_TIME} 
    done 

    # Start your algorithm here 

但是,爲了防止無限循環,你應該添加一些綁定:

FILE_TO_CHECK="/var/logs/deployment.log" 
    LINE_TO_CONTAIN="Server started" 
    SLEEP_TIME=10 
    COUNT=0 
    MAX=10 
    while [ $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") -a ${COUNT} -lt ${MAX} ] 
    do 
     sleep ${SLEEP_TIME} 
     COUNT=$(($COUNT + 1)) 
    done 

    if [ ! $(cat FILE_TO_CHECK | grep "${LINE_TO_CONTAIN}") ] 
    then 
    echo "Let's go, the file is containing what we want" 
    # Start your algorithm here 
    else 
    echo "Timed out" 
    exit 10 
    fi 
+0

'$(SLEEP_TIME)'應該是'$ {SLEEP_TIME}'。沒有必要貓和管道grep。大寫變量是一個壞習慣。 – Biffen 2014-09-21 14:01:50

+0

謝謝你的評論。我已經修復了'$ {SLEEP_TIME}'。關於命名約定,您正確使用小寫似乎是一個更好的主意,以便不覆蓋環境變量。 – 2014-09-21 14:04:51

+0

while循環中的邏輯是否顛倒了?只要grep找到某個東西,它就會循環,而當它沒有時會停止。如果直到'grep -q字符串文件;睡1s; done'? – Biffen 2014-09-21 14:12:43

-1

試試這個:

#!/bin/bash 

canary_line='Server started' 
file='/var/logs/deployment.log' 

echo 'Waiting for server to start' 

until grep -q "${canary_line}" "${file}" 
do 
    sleep 1s 
done 

echo 'Server started' 

調整sleep的parame你的口味。

如果文件中的行需要與完全匹配,即整行,請將grep的第二個參數更改爲"^${canary_line}$"

如果該行包含任何字符grep認爲是特殊的,你將不得不解決......不知何故。

+0

可能會導致無限循環 – 2014-09-22 17:59:10

+1

是的,它會一直運行,直到該行出現在文件中或直到它被殺死。我認爲這是OP想要的。 – Biffen 2014-09-22 19:05:51

+0

...一個*無限循環*,如果你問我,是程序無法自行獲取的一個。這不是其中之一。 – Biffen 2014-09-22 19:13:18

相關問題