私は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
の大文字の意味を理解していません。誰かが私に違いを説明してくれれば幸いです。
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
で演習を繰り返し、違いを観察します。
簡略化すると、ファイルを開くと、ディスク上のファイルの正確な場所のメタデータを含むiノードが取得されます。その後、Tailはそのファイルへの変更をリッスンします。
ファイルを削除して同じ名前で新しいファイルを作成すると、ファイル名は同じになりますが、iノードは異なります(おそらくディスクの別の場所に保存されます)。 tail -f
fillは再試行せず、新しいiノードをロードします。tail -F
はこれを検出します。
ファイルの名前を変更したり移動したりしても、同じ効果が得られます。たとえば/var/log/messages
に従い、logrotateはログを/var/log/messages.1
にローテーションします。 -f
の末尾は、messages.1
を指す古いiノードを引き続きリッスンします。 -F
の末尾はこれを実現し、新しいiノードを読み取ります。