以前に見つかった内容を気にせずに「tail -f | grep -q」をトリガーとして使用

以前に見つかった内容を気にせずに「tail -f | grep -q」をトリガーとして使用

現在、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

しかし、問題は時々以前の実行を読み、すぐに完了することです。


予想プロセス:

Tomcatが停止しました - > Tomcatが再起動しました - > tail shellが実行されました - > Tomcatが完全に起動しました - > Shellが完了したことをお知らせします


私のスクリプトができること:

Tomcatが停止しました - > Tomcatが再起動されました - > tail shellが実行されました - >以前のログのためにTomcatが完全に起動したというメッセージがすぐに表示されました。

どうやってこれを達成できますか?

答え1

デフォルトでは、tail -f後続のジョブが開始される前に最後の10行が読み取られます。-nその番号を上書きすることができるので、tail -n0 -f 現在の終わりから始め、前の項目を無視して新しい変更に従います。

以下を実行している場合は注意してください。

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

tailTomcatが開始するように行を書く前に開始する時間があるほど十分に遅いTomcatに依存しています。通常、これは可能ですが、スクリプトはtail実行前にランダムに長い遅延を持つようにスケジュールできます。したがって、実際には何とかtail最初に始める準備をする必要があります。

次のことを想像できますが、わかりません。

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

また、一致する行を見ると終了する小さな問題がありますが、grep -qこれは終了しませんtail。パイプが閉じられていることを確認し、tailパイプに書き換えようとしたときにのみ終了します(次にファイルに新しい内容が表示されたとき)。

もちろん、ファイルが常に新しい項目でいっぱいになると、これはすぐに発生します。

関連情報