読者です 読者をやめる 読者になる 読者になる

Alice の備忘録

大人の学習帳

tailにつける小文字「-f」と大文字「-F」の違い

はじめてtailコマンドを使ったら、オプションの小文字「-f」と大文字「-F」の違いが分からなかったので調べた。

tail コマンドの概要

tail自体はファイルの末尾を表示するコマンド。
デフォルトでは末尾の10行が表示される。
ログファイルなどで新たにログが書き込まれ、ファイルの末尾が更新されると、tailによって続けて追加分も表示されていくので、ログ監視によく使われている。

テストでは正常に動作していること(エラーログがでていない、想定されてログがでている)の確認結果として、出力結果のエビデンスを保存することもある。

結論

先に結論を言うと以下のような感じ。

  • 違いはtailしているファイルが削除されたり名前変更された場合の動作
  • 小文字の「-f」の場合、ファイルにアクセスできなくなるとメッセージが出力されて終わり
  • 大文字の「-F」の場合、ファイルにアクセスできなくなっても、再度同名のファイルができたらその末尾を出力する

調べたこと

とりあえずman tailで見てみる。

-f, --follow[={name|descriptor}]
              output appended data as the file grows;

              an absent option argument means 'descriptor'

-F     same as --follow=name --retry

manの書かれ方のルールが分からなくて確認したら、以下のような感じらしい。

[]:省略可能なオプション
{}:省略不可能なオプション
| :これで区切られた選択肢のどちらかを選択する

これをもとに確認した結果が以下。

小文字「-f」(または「–follow」)

開いているファイルから末尾を出力する。
(ファイルの中身は常に追記されていく想定)

--followを使った場合のみ、[]の中のいずれかのオプションを指定することができる。 このオプションによってファイルの追跡方法を指定できるようだ。
それぞれの意味は以下の通り。

  • name
    --follow=nameと指定するとファイルの名前で追跡する。 そのため、tailしているファイルが削除されたり、名前の変更が行われるとそれを検出してメッセージが表示される。 --retryが指定されていなければ、次のようにファイルにアクセスできなくなったことを報告するだけで終わる(再検査はしてくれない)。
tail: `/aaa/bbb/ccc/hoge.log' has become inaccessible
: そのようなファイルやディレクトリはありません
  • discriptor
    --follow=discriptorと指定するとディスクリプタ *1 で追跡する。 そのため、tailしているファイルが削除されたり、名前の変更が行われても検出されず、特にメッセージは表示されない。

大文字「-F」

--follow=name --retryと同じ意味と書かれている。
--retryは次のように使える。

  • –retry
    指定すると、ファイルの削除やファイル名の変更がされた後も同じ名前のファイルが再作成されていないかをチェックし続ける。そして、同じ名前のファイルが作成されたら再度そのファイルを開き、末尾を出力してくれる。再度開く時には次のようなメッセージが表示される。
tail: `/aaa/bbb/ccc/hoge.log' has appeared;
following end of new file

上記の--follow=name--retryの意味を合わせると 大文字「-F」の意味は次のようになる。

ファイル名で追跡し、ファイル削除・ファイル名変更が行われるとそれを検出し、もともとtailしていたファイル名と同じファイルが作成されたら、再度そのファイルを開いて末尾を出力する。

以上。

*1:ディスクリプタ:プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子
ファイルディスクリプタとは|ファイル記述子|file descriptor : 意味/定義 - IT用語辞典