ファイルに特定の文字列が出てくるまで待つ

シェルスクリプトを書いていて、Webアプリに処理を投入してから、ログファイルに処理完了のメッセージが出るまでスクリプトをwaitさせたいと思った。最初はrubyperlでファイルを開いて1秒おきにEOFまで読んで文字列マッチしようと思ったが、expectを使えば1行だった。expect初めて使ったよ。

expect -c 'spawn tail -f aaa.txt ; expect -timeout -1 "shutdown"' > /dev/null

なぜログを見ないといけないのかというと、対象がWebフレームワーク上で動いていて、特定URLを叩くことで処理開始されるという実装なので、ログを見る以外に処理状況がわからない。

追記(09/01/13)

ログが大量に出てきたら、expect内部のバッファが一杯になってしまった。下のようにして時々マッチング用バッファを捨てる必要があるようだ。

expect -c "spawn tail -f aaa.txt ; expect -timeout -1 -ex \"shutdown\" { exit } -ex \"\\n\" { exp_continue }"