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


41

私は決して使用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

lower -fが何をするのかは簡単に理解できますが、大文字-Fが何をしようとしているかはわかりません。違いを誰かが説明してくれれば幸いです。

回答:


75

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

$ tail -f /var/log/messages

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

tailこのようにしてファイルを開くと:

$ tail -F /var/log/messages

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

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

tail: file has been replaced, reopening.

監視しているファイルが消えて再表示されると、出力に表示されます。


これをテストできます

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

$ cat >myfile

これで、入力するのを待つことになります。先に進んで、ちょっとした意味のない数行を入力してください。すべてファイルに保存されますmyfile

、別の(多分他の端末では、シェルセッション中断なしcat):

$ tail -f myfile

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

cat押して終了し、ファイルCtrl+D削除myfileます。

$ rm myfile

次に、猫を再度実行します。

$ cat >myfile

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

GNU tailでは、これらの行は2番目のシェルセッション(まだ実行中)では表示されませんtail -f

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


ああなるほど。foo.logなどのシステムログファイルがあり、foo.logとともにfoo_06242016.logが表示されることがあります。だから私はtail -f foo.logを実行し、foo_06242016.logを指しますか?
-DaeYoung

1
@DaeYoungいや、そうでもない。実行tail -f foo.logして、システムがfoo.logたとえば表示さfoo.log.0.gzれる出力に移動した場合、停止するだけです。-F他方で使用する場合は foo.log間に切れ目なく新しいコンテンツが表示されます。
クサラナナンダ

4
+1 ... GNUの実装に対する回答を制限することなく、他の環境で何が期待できるかを人々に知らせてくれてありがとう。
-TOOGAM

2
例と非常に素晴らしいイラスト。
CVn

1
@Kusalananda:運動をありがとう。違いを観察し、tail -fとtail -Fが何をするかを理解するのに役立ちました。恵まれた一日を!
-DaeYoung

14

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

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

ファイルの名前を変更/移動した場合も同じ効果が生じます。たとえば/var/log/messages、logrotateを実行すると、ログがにローテーションされます/var/log/messages.1。テールは-fを指す古いiノードをまだ聞き取りmessages.1ます。tail with -Fはこれを実現し、新しいiノードを読み取ります。


ご説明ありがとうございます。今では私にとって非常に理にかなっています。
-DaeYoung

2
いいんだよ。そのような仕立ては、間違いを犯しやすいことを理解しています。私は特にあなたの以前のスペルミスが修正され、承認されたという事実を楽しんでいます...別のスペルミスで。:)
TOOGAM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.