私はtail -F
コマンドを一度も使用したことがなく、代わりに常に使用していましたtail -f
が、誰かが-F
あまり説明せずにその方が良いと言っていました。
tail コマンドのマニュアルページを調べました。
-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
が、upper case が何をしようとしているのかはわかりません-F
。違いを説明していただけるとありがたいです。
答え1
GNUtail
ユーティリティについて説明しています。これら 2 つのフラグの違いは、たとえばログ ファイルなどのファイルを開いた場合、次のようになることです。
$ tail -f /var/log/messages
...そして、私がログ ファイルに書き込まれるメッセージを見ている間に、私のマシンのログ ローテーション機能によってそのログ ファイルがローテーションされると (「ローテーション」とは、削除または別の場所への移動などを意味します)、表示される出力は停止します。
次のようにファイルを開くとtail
:
$ tail -F /var/log/messages
...そして再び、ファイルがローテーションされると、出力はコンソールに流れ続けます。なぜならtail
、ファイルが再び利用可能になるとすぐに、つまりログに書き込むプログラムがログに書き込みを開始するとすぐにファイルが再度開かれるからです。新しい /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
。最初のシェル セッションに戻ってさらに何かを入力すると、その出力はすぐにtail
2 番目のシェル セッションに表示されます。
cat
を押して終了しCtrl+D、取り除くファイルmyfile
:
$ rm myfile
次に、もう一度 cat を実行します。
$ cat >myfile
...そして何かを数行入力します。
GNUではtail
、これらの行はない2 番目のシェル セッション (tail -f
まだ実行中) に表示されます。
同じ練習を繰り返してtail -F
、違いを観察します。
答え2
簡単に言えば、ファイルを開くと、ファイルがディスク上のどこにあるのかを示すメタデータを含む inode が取得されます。その後、Tail はそのファイルの変更を監視します。
ファイルを削除して、同じ名前で新しいファイルを作成すると、ファイル名は同じになりますが、別の inode になります (おそらくディスク上の別の場所に保存されます)。filltail -f
は再試行せずに新しい inode をロードし、tail -F
これを検出します。
ファイルを名前変更/移動した場合も同じ効果が発生します。たとえば、次のようにして/var/log/messages
logrotate がログを にローテーションすると、は を指す古い inode を引き続きリッスンします。 tail は/var/log/messages.1
これを認識して新しい inode を読み取ります。-f
messages.1
-F