web-dev-qa-db-ja.com

「tail -f」と「tail -F」の違いは何ですか?

私はtail -Fコマンドを使用したことがなく、代わりに常にtail -fを使用しましたが、誰かが-Fの方が多くの説明なしに優れていると言っています。

Tailコマンドのmanページを調べました。

-f output appended data as the file grows;

-F Same as --follow=name --retry

--retry Keep trying to open a file even when it is or becomes inaccessible

-fの小文字の意味を理解するのは簡単ですが、-Fの大文字の意味を理解していません。誰かが私に違いを説明してくれれば幸いです。

43
DaeYoung

GNU tailユーティリティについて説明します。これらの2つのフラグの違いは、ファイルを開くと、たとえば、次のようなログファイルです。

$ tail -f /var/log/messages

...そして、私のマシンのログローテーション機能が、書き込まれているメッセージを監視しているときにそのログファイルをローテーションすることを決定した場合(「ローテーション」は、削除または別の場所への移動などを意味します)、表示される出力はやめる。

次のようにtailでファイルを開くと、

$ tail -F /var/log/messages

...そして再び、ファイルがローテーションされます。tailは、ファイルが再び利用可能になるとすぐに、つまりプログラムがログに書き込むときに、ファイルを再び開くため、コンソールに出力が流れ続けます。 new/var/log/messagesへの書き込みを開始しました。

無料のBSDシステムには-Fオプションはありませんが、tail -fはGNUシステムでtail -Fが行うように動作しますが、以下の違いがあります。メッセージ

tail: file has been replaced, reopening.

監視しているファイルが消えて再び現れるときの出力。


これはテストできます

1つのシェルセッションで、

$ cat >myfile

これで、タイプするのを待ちます。先に進んで、意味不明な数行を入力してください。すべてmyfileファイルに保存されます。

anotherシェルセッション(多分別の端末で、を中断せずにcat):

$ tail -f myfile

これにより、myfileの内容(の終わり)がコンソールに表示されます。最初のシェルセッションに戻ってさらに何かを入力すると、その出力は2番目のシェルセッションのtailによってすぐに表示されます。

ここでcatを終了して終了します Ctrl+D、およびremovemyfileファイル:

$ rm myfile

次に、猫をもう一度実行します。

$ cat >myfile

...そして、数行入力します。

GNU tailの場合、これらの行はnotが2番目のシェルセッションに表示されます(tail -fはまだランニング)。

tail -Fで演習を繰り返し、違いを観察します。

76
Kusalananda

簡略化すると、ファイルを開くと、ディスク上のファイルの正確な場所のメタデータを含むiノードが取得されます。その後、Tailはそのファイルへの変更をリッスンします。

ファイルを削除して同じ名前で新しいファイルを作成すると、ファイル名は同じになりますが、iノードは異なります(おそらくディスクの別の場所に保存されます)。 tail -f fillは再試行せず、新しいiノードをロードします。tail -Fはこれを検出します。

ファイルの名前を変更したり移動したりしても、同じ効果が得られます。たとえば/var/log/messagesに従い、logrotateはログを/var/log/messages.1にローテーションします。 -fの末尾は、messages.1を指す古いiノードを引き続きリッスンします。 -Fの末尾はこれを実現し、新しいiノードを読み取ります。

14
nsg