Unix Tailで複数のファイルを監視すると期待通りにいかないことがある
by Allen Fung, Senior Software Engineer
"tail -F "は、ファイルの更新を監視するためによく使われます。
ここでは、tailを使って複数のファイルを同時に監視する方法を紹介します。
$ tail -F file1 file2
上記のコマンドの問題点は、file1とfile2に書き込まれたテキストが、新しい行の境界でディスクにフラッシュされない可能性があることです。その結果、tailの出力において、一方のファイルのテキストが他方のファイルのテキストに継ぎ足されてしまう可能性があります。
問題の例を挙げてみましょう。file1に次のようなものが書き込まれたとします。
ライン1
line_2
ライン3
また、file2に以下のように書き込まれたとします。
LINE_A
LINE_B
LINE_C
テキストが改行でフラッシュされない場合、tailから次のような出力を得ることができます。
LINE_A
_1
LINE_B
line_2
LINE_C
ライン3
ご覧の通り、「LINE_A」が「LINE_1」に継ぎ足され、1行目に「LINELINE_A」が表示されています。ここで、上記の問題を解決する方法をいくつかご紹介します。
複数のテールを並行して実行し、各テールの出力を grep にパイプします。grepのオプションを使って、改行の境界でのみ出力するようにする必要があります。
ファイルから完全な行を受け取ったときだけ印刷する新しいtailを書きます。
ログファイルを生成したアプリケーションを変更し、単一のログファイルのみを作成します。テキストが新しい行の境界で単一のファイルにフラッシュされることを確認する必要があります。
上記(1)を実装するためのコードをご紹介します。
$ vi multi-tail.sh
#!/bin/sh
# これが終了すると、すべてのバックグラウンドプロセスも終了します。
trap 'kill $(jobs -p)' EXIT
# 与えられたファイル名を順に調べていく
for file in "$@"
ド
# バックグラウンドでファイルを追いかけます。
tail -F $file | grep -line-buffered "" &
済
# wait ... until CTRL+C
待つ
(2)と(3)の実装は、読者にお任せします。
ご覧いただきありがとうございます。