it-swarm.com.de

Was ist der Unterschied zwischen "tail -f" und "tail -F"?

Ich habe nie tail -F Befehl stattdessen immer verwendet tail -f aber jemand hat mir gesagt, dass -F ist besser ohne viel Erklärung.

Ich habe in der Manpage nach dem Befehl "tail" gesucht.

-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

Es ist leicht zu verstehen, was niedriger -f tut aber ich folge nicht welchem ​​Großbuchstaben -F versucht es zu tun. Ich würde mich freuen, wenn mir jemand die Unterschiede erklären kann.

43
DaeYoung

Sie beschreiben das Dienstprogramm GNU tail. Der Unterschied zwischen diesen beiden Flags besteht darin, dass beim Öffnen einer Datei beispielsweise eine Protokolldatei wie folgt angezeigt wird:

$ tail -f /var/log/messages

... und wenn die Protokollrotationsfunktion auf meinem Computer beschließt, diese Protokolldatei zu drehen, während ich sehe, wie Nachrichten darauf geschrieben werden ("Drehen" bedeutet Löschen oder Verschieben an einen anderen Ort usw.), wird die angezeigte Ausgabe nur angezeigt halt.

Wenn ich die Datei mit tail wie folgt öffne:

$ tail -F /var/log/messages

... und wieder wird die Datei gedreht, die Ausgabe würde weiterhin in meiner Konsole fließen, da tail die Datei erneut öffnen würde, sobald sie wieder verfügbar wäre, dh wenn die Programme in das Protokoll schreiben begann zu schreiben an die new /var/log/messages.

Auf den freien BSD-Systemen gibt es kein -F Option, aber tail -f verhält sich wie tail -F tut auf GNU Systemen, mit dem Unterschied, dass Sie die Nachricht erhalten

tail: file has been replaced, reopening.

in der Ausgabe, wenn die zu überwachende Datei verschwindet und wieder angezeigt wird.


SIE KÖNNEN DAS TESTEN

Führen Sie dies in einer Shell-Sitzung aus

$ cat >myfile

Das wartet nun darauf, dass Sie etwas eingeben. Geben Sie einfach ein paar Zeilen Kauderwelsch ein. Es wird alles in der Datei myfile gespeichert.

In einer anderen Shell-Sitzung (möglicherweise in einem anderen Terminal, ohne Unterbrechung des cat):

$ tail -f myfile

Dies zeigt den (Ende des) Inhalts von myfile in der Konsole an. Wenn Sie zur ersten Shell-Sitzung zurückkehren und etwas mehr eingeben, wird diese Ausgabe in der zweiten Shell-Sitzung sofort von tail angezeigt.

Beenden Sie nun cat durch Drücken von Ctrl+Dund entfernen die Datei myfile:

$ rm myfile

Dann lassen Sie die Katze erneut laufen:

$ cat >myfile

... und tippe etwas, ein paar Zeilen.

Mit GNU tail werden diese Zeilen nicht in der zweiten Shell-Sitzung angezeigt (wobei tail -f läuft noch).

Wiederholen Sie die Übung mit tail -F und beobachte den Unterschied.

76
Kusalananda

Vereinfacht ausgedrückt, erhalten Sie beim Öffnen einer Datei den Inode, der einige Metadaten darüber enthält, wo genau sich die Datei auf Ihrer Festplatte befindet. Tail wartet dann auf Änderungen an dieser Datei.

Wenn Sie die Datei entfernen und eine neue mit demselben Namen erstellen, ist der Dateiname derselbe, aber es handelt sich um einen anderen Inode (und wahrscheinlich an einem anderen Ort auf Ihrer Festplatte). tail -f Füllen Sie nicht erneut und laden Sie den neuen Inode. tail -F Erkennt dies.

Der gleiche Effekt tritt auf, wenn Sie eine Datei umbenennen/verschieben. Wenn Sie beispielsweise /var/log/messages Folgen und logrotate das Protokoll auf /var/log/messages.1 Dreht. Schwanz mit -f hört immer noch den alten Inode, der auf messages.1 zeigt. Schwanz mit -F erkennt dies und liest den neuen Inode.

14
nsg