らっちゃいブログ

日々の学びと気づきを発信するブログ

tailコマンドで対象ファイルがローテートされても自動で追随する方法

スポンサーリンク

地味に便利だったのでメモしておきます。

ログファイルをリアルタイムで確認するときに利用する tail -f コマンドですが、ファイルサイズでローテートされるようなログだとすぐに止まってしまい、改めてコマンドを実行し直す必要があり、ストレスが溜まりますよね。

tail のオプションにはぜひ -F を与えてあげてください。たったそれだけで、リネームされたりローテートされても自動的に追随してくれるようになります。

本当でしょうか?tail の man を見てみましょう。

-F   The -F option implies the -f option, but tail will also check to see if the file being followed has been renamed or rotated.  The file is closed and reopened
     when tail detects that the filename being read from has a new inode number.  The -F option is ignored if reading from standard input rather than a file.

つまり、リネームやローテートが起きたら新しいinode番号を検知してオープンし直してくれるようです。

では試してみます。まずは -f オプションの挙動から見てみましょう。

以下のように tail.txt を作成し、tail -f しておきます。

$ echo "a" > tail.txt
$ tail -f tail.txt
a

この状態で tail.txt を tail2.txt にリネームし、tail.txt へ"b"を出力します。つまりローテートを発生させます。

$ mv tail.txt tail2.txt && echo "b" >> tail.txt

結果はこちら。

$ tail -f tail.txt
a

変化なしです。-f ではローテートに追随してくれませんでした。

それでは-Fの動きを確認してみましょう。

$ echo "a" > tail.txt
$ tail -F tail.txt
a

準備ができたところで、ローテートしてみます。

$ mv tail.txt tail2.txt && echo "b" >> tail.txt

結果はどうなっているかというと

$ tail -F tail.txt 
a
b

すばらしい。しっかりローテートに追随してくれていますね。

いまのところ -F オプションを使うことによる弊害はなさそうなので、今後は -f ではなく -F を使っていこうと思います。