LoginSignup
217
178

More than 5 years have passed since last update.

tailコマンドのオプション「f」と「F」

Posted at

この記事を書くに至った経緯

tailコマンド。ログ監視等で本当にお世話になっています。
いつもオプションとして「F」(大文字の方)を使っているのですが、その理由がその昔、「f」(小文字の方)よりよいと誰かに聞いたからなのです。
その時に理由も聞いたはずなのですが、毎日のように使っている内に忘れてしまいましたw
先日ふとしたきっかけで「どうしてF(大文字の方)使ってるの?」と尋ねられ、そう言えばなんでだっけと調べたので、忘れないように記事に残しておきたいと思ったのです。
結論、私は「F」が便利だと思うからそれを使うよ!って記事ですw

tailコマンド

本来tailは、ファイルの末尾10行(デフォルト)を表示するためのコマンドです。
対になるコマンドとしてhead(こちらはファイルの先頭10行(デフォルト)を表示する)があります。
表示する行数を変更するためにはどちらのコマンドも-nオプションで行数を指定します。
以下のファイルを使って簡単な例を示しておきます。(headは先頭になるだけなので割愛)

$ cat hoge.txt 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

例1)オプション指定なしでファイル末尾を表示(10行表示)

$ tail hoge.txt 
11
12
13
14
15
16
17
18
19
20

例2)-nオプションで表示する行数を指定(今回は3行)

$ tail -n 3 hoge.txt 
18
19
20

「f」と「F」の違い

どちらもファイルの最後まで表示をしても終了せず、ファイル末尾が更新されると続けて追加分が表示されます。(このためログ監視等に大変役立ちます。Ctrl + cで抜けられる)
「f」は、ファイルがリネーム等で変更になった場合に、元々オープンしていたファイルを引き続きtailし続けます。
一方、「F」はファイルがリネームされた場合にファイルをオープンし直します。

以下の場合を考えてみましょう。
1. hoge.txtに1行追加
2. hoge.txthoge.txt.bkにコピー
3. hoge.txtに1行追加
4. hoge.txt.bkに1行追加

この時tailで表示されるのは以下の内容です。

オプション 表示される内容 コピー後の参照
-f 1, 4 hoge.txt.bk
-F 1, 3 hoge.txt

ログローテートなどでファイルがリネームされることを想像すると理解しやすいと思います。
例えばaccess_logが毎時access_log.yyyyMMddHHなどにローテートされる場合、
ローテート後、-faccess_log.yyyyMMddHHを表示し続け、-Fは再度access_logをオープンし新たなaccess_logを表示できる、というわけです。

tail: /usr/local/app/logs/gc.log: ファイルが切り詰められました

このような出力の後、新しいファイルの末尾が表示されていきます。

まとめ

「f」と「F」はオープンしていたファイルがリネームされた時の挙動が違う。

  • 「f」は元々オープンしていたファイルを引き続きtail
  • 「F」はリネーム時に同名ファイルを再度オープンしなおす

ログローテートなどで引き続き同名のファイルが存在する場合は「F」を指定すればファイルを開き直すことなく連続してtailできますね。

おまけ

tailf

tailf(オプションではなくそういうコマンド)もあるようです。
昔はファイル追加分を検知(?)して読み込みエココマンドだったみたいですが、現在はtail -fと同じ挙動(定期的にファイルサイズチェックをして増えていたら読み込み)らしいです。

less中に「F」

less中にShift + fでも同じような挙動になります。
Ctrl + cで止められます。

217
178
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
217
178