複数のプロセスを起動したいが、起動順序に依存関係があるため、前のプロセスが起動してからでないと、次のプロセスを起動してもエラー終了してしまう。
前のプロセスのログを監視して、起動処理が終了したときにでるメッセージが出力されたら次のプロセスを起動するようにした。
その際、監視用に以下の関数を作成した。
# logwatch ファイルパス 検索文字列
logwatch(){
tail --follow=name "$1" | grep --line-buffered "$2" | while read line
do
#echo $line
pkill -P $$ tail
break
done
}
tailに「--follow=name」を指定するのは、ログが再作成されてもオープンし直すようにである。
また、grepの「--line-buffered」は結果をバッファリングせず、即座に後続のコマンドにパイプでつなぐためである。
また、該当メッセージがみつかれってもtailを終了させwhileから抜けないと関数が終了しないため、pkillでtailを終了させ、その後にbreakしている。
pkillでは他にtailが実行中でもよいように、「-P $$」で自分で起動したtailのみを終了している。
該当メッセージが出力されるたびに何か処理をさせたければ、do~done内に必要な処理を書いてあげればよい。
また、単に該当メッセージが出力されたら終了すればよいなら、以下のような関数でもよい。
# logwatch ファイルパス 検索文字列
logwatch2(){
tail --follow=name "$1" | (grep -q "$2"; pkill -P $$ tail)
}
なおtailを使うので、起動してすぐにたくさんのログが出力されるプログラムだと最初のtailですでに過ぎてしまい監視できなくなるので、注意が必要。
プログラム起動前になければログファイルを作成して監視を先にするとよいかも。
最終更新:2012年01月14日 23:55