##この記事を書くに至った経緯
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」はファイルがリネームされた場合にファイルをオープンし直します。
以下の場合を考えてみましょう。
-
hoge.txt
に1行追加 -
hoge.txt
をhoge.txt.bk
にコピー -
hoge.txt
に1行追加 -
hoge.txt.bk
に1行追加
この時tail
で表示されるのは以下の内容です。
オプション | 表示される内容 | コピー後の参照 |
---|---|---|
-f | 1, 4 | hoge.txt.bk |
-F | 1, 3 | hoge.txt |
ログローテートなどでファイルがリネームされることを想像すると理解しやすいと思います。
例えばaccess_log
が毎時access_log.yyyyMMddHH
などにローテートされる場合、
ローテート後、-f
はaccess_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
で止められます。