2017-06-29 85 views
0

我寫了一個快速bash腳本,用於監視特定字符串的日誌,然後退出。除了問題是當我執行「ps -fu $ user」時,腳本返回後,仍然可以繼續運行腳本及其子「尾部」進程。bash腳本不存在

#!/bin/bash 
####### MAIN ####### 

FILE=$1 
MSG="" 
while read LOGLINE 
do 
if [[ "${LOGLINE}" == *"someString"* ]]; then 
    MSG=${LOGLINE} 
    break 
fi 
done < <(tail -f ${FILE}) 
pkill -P $$ tail 
echo ${MSG} 

我從持續寫入的應用程序傳遞一個日誌文件。當我運行這個腳本時,它會找到someString的第一個實例,將它回顯到stdout並退出。除了尾巴過程似乎沒有被殺死,劇本本身也沒有。

+0

你最好用尾巴-f $ 1 |同時讀取LOGLINE,然後回顯$(MSG),並在條件滿足時退出而不是中斷。 –

+0

......或者更坦白地說,因爲'SIGPIPE'上的'tail'很容易退出,所以這個無疑是倒退了。 – dhke

回答

0
#!/bin/bash 
####### MAIN ####### 

FILE=$1 
MSG="" 
tail -f ${FILE} | while read LOGLINE 
do 
if [[ "${LOGLINE}" == *"someString"* ]]; then 
    MSG=${LOGLINE} 
    exit 
fi 
done 

上面的解決方案從尾部逐行逐行讀取輸出,直到if條件滿足。一旦滿足,整個腳本/過程就會結束。

+0

儘管此代碼可能會回答問題,但提供有關如何解決問題和/或爲何解決問題的其他上下文將提高​​答案的長期價值。 –

1

其重要的是要理解爲什麼會發生。

問題是用於退出循環的「break」。休息是在if語句中。在這裏退出會更合適,因爲你想一起退出。

也是這部分是沒有必要的,你只需要使用 「完成」

做< <(尾-f $ {FILE})

你永遠不會 「完成」 結束與「尾巴」,因爲你從來沒有要求它在第一個地方。

因爲我認爲你的日誌沒有在腳本的開始處集中管理,所以你需要拖拽新的內容,所以你應該管道/或者將尾部寫入臨時文件,然後在腳本的退出時刪除。要麼會工作。