Grep

’tail -f | grep -q’ 作為觸發器不用擔心前面找到的

  • April 19, 2021

目前,查看我的 Tomcat 是否已完全啟動的唯一方法是檢查 apache-tomcat 日誌:

tail -f ./catalina.out

並在我做任何工作之前尋找這種模式。

org.apache.catalina.startup.Catalina.start Server startup in [0-9]* ms

我想自動化這個過程並編寫了下面的腳本,它確實有效。

tail -f ./catalina.out | egrep -q '*.Catalina.start Server startup in [0-9]* ms$' 
touch done

但問題是它有時會讀取以前的 Startup 並立即完成。


期望的過程:

Tomcat 停止 -> Tomcat 重新啟動 -> 尾部 shell 執行 -> Tomcat 完全啟動 -> shell 告訴我它已完成


我的腳本可能會做什麼:

Tomcat 停止 -> Tomcat 重新啟動 -> 尾部 shell 執行 -> 它立即告訴我 Tomcat 由於之前的日誌已完全啟動。

我如何實現這一目標?

預設情況下tail -f讀取最後 10 行,然後開始跟進。您可以使用-n覆蓋該數字,因此tail -n0 -f 從目前結束開始,忽略任何早期內容,然後遵循新的更改。

請注意,如果您執行:

start tomcat in some way
tail -n0 -f logfile | grep -q

你依賴於 tomcat 足夠慢,以至於tail在 tomcat 寫下告訴它開始的行之前有時間開始。通常情況下可能是這樣,但腳本可能會被安排,以便在tail執行前有一個任意長的延遲。所以,真的,你應該以某種方式安排tail先開始。

我可以想像這樣的事情,但我不確定:

tail -n0 -f logfile | grep -q &
pid=$!
start tomcat in some way
wait "$pid"

此外,還有一個小問題,即當grep -q它看到匹配行時退出,這不會導致tail退出。只有當tail它看到管道關閉時才會退出,並且只有在它嘗試再次寫入管道時才會發生,下次新的東西出現在文件中時。

當然,如果文件不斷填充新條目,這將很快發生。

引用自:https://unix.stackexchange.com/questions/645773