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

41

Ich habe nie einen tail -FBefehl benutzt, sondern immer einen, tail -faber jemand hat mir gesagt, dass dies -Fohne viel Erklärung besser ist.

Ich habe die Manpage für den Befehl tail nachgeschlagen.

-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 Lower -ftut, aber ich verfolge nicht, was Großbuchstaben -Fzu tun versuchen. Ich würde mich freuen, wenn mir jemand die Unterschiede erklären kann.

DaeYoung
quelle

Antworten:

75

Sie beschreiben das GNU- tailDienstprogramm. Der Unterschied zwischen diesen beiden Flags besteht darin, dass ich, wenn ich eine Datei öffne, beispielsweise eine Protokolldatei wie die folgende:

$ tail -f /var/log/messages

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

Wenn ich die Datei so öffne tail:

$ tail -F /var/log/messages

... und wieder wird die Datei gedreht, die Ausgabe würde weiterhin in meiner Konsole fließen, da taildie Datei erneut geöffnet wird, sobald sie wieder verfügbar ist, dh wenn das oder die Programme, die in das Protokoll schreiben, mit dem Schreiben in das neue beginnen /var/log/messages .

Auf den freien BSD-Systemen gibt es keine -FOption, aber tail -fsie verhalten sich wie tail -Fauf GNU-Systemen, mit dem Unterschied, dass Sie die Nachricht erhalten

tail: file has been replaced, reopening.

in der Ausgabe, wenn die von Ihnen überwachte Datei verschwindet und erneut angezeigt wird.


DAS KÖNNEN SIE TESTEN

Tun Sie dies in einer Shell-Sitzung

$ cat >myfile

Das wird nun darauf warten, dass Sie etwas eingeben. Mach einfach weiter und tippe ein paar Zeilen Kauderwelsch. Es wird alles in der Datei gespeichert myfile.

In einer anderen Shell-Sitzung (möglicherweise in einem anderen Terminal, ohne das zu unterbrechencat ):

$ tail -f myfile

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

Beenden catSie nun Ctrl+Dmit und entfernen Sie die myfileDatei:

$ rm myfile

Führen Sie dann die Katze erneut aus:

$ cat >myfile

... und etwas eintippen, ein paar Zeilen.

Mit GNU tail, werden diese Linien nicht zeigen in der zweiten Shell - Sitzung auf (wo tail -fnoch läuft).

Wiederholen Sie die Übung mit tail -Fund beobachten Sie den Unterschied.

Kusalananda
quelle
Oh, ich verstehe. Ich habe eine Systemprotokolldatei wie foo.log, dann sehe ich manchmal foo_06242016.log zusammen mit foo.log. Also starte ich tail -f foo.log, es wird auf foo_06242016.log zeigen?
DaeYoung
1
@DaeYoung Nein, nicht ganz. Wenn Sie ausführen tail -f foo.logund Ihr System foo.logz. B. zu foo.log.0.gzder Ausgabe wechselt, die Sie sehen, wird dies einfach gestoppt. Wenn Sie -Fandererseits verwenden, würden Sie den Inhalt des neuen foo.log ohne Pause dazwischen sehen.
Kusalananda
4
+1 ... danke, dass Sie Ihre Antwort nicht auf die Implementierung von GNU beschränken, sondern die Leute wissen lassen, was in einer anderen Umgebung zu erwarten ist.
TOOGAM
2
Sehr schöne Illustration mit dem Beispiel.
ein Lebenslauf am
1
@ Kusalananda: Danke für die Übung. Ich bemerkte den Unterschied und es half mir besser zu verstehen, was Schwanz -f und Schwanz -f tun. haben einen gesegneten Tag!
DaeYoung
14

Vereinfacht ausgedrückt, wenn Sie eine Datei öffnen, erhalten Sie 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 ist ein anderer Inode (und wahrscheinlich an einem anderen Ort auf Ihrer Festplatte gespeichert). tail -fFüllen Sie nicht erneut und laden Sie die neue Inode, dies tail -Fwird erkannt.

Der gleiche Effekt tritt auf, wenn Sie eine Datei umbenennen / verschieben. Wenn Sie zum Beispiel folgen /var/log/messagesund logrotate dreht sich das Protokoll um /var/log/messages.1. tail with -fhört sich immer noch die alte inode an, die darauf verweist messages.1. Schwanz mit -Fwird dies erkennen und die neue Inode lesen.

nsg
quelle
Danke für Ihre Erklärung. Es macht jetzt viel Sinn für mich.
DaeYoung
2
Es ist in Ordnung. Ich verstehe, dass ein solcher Fehler leicht zu begehen ist. Es freut mich besonders, dass Ihr früherer Rechtschreibfehler behoben und bestätigt wurde ... mit einem anderen Rechtschreibfehler. :)
TOOGAM