Ich habe nie tail -F
den Befehl verwendet, sondern immer. tail -f
Jemand hat mir jedoch -F
ohne große Erklärung gesagt, dass das besser sei.
Ich habe auf der Manpage nach dem Tail-Befehl 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 „lower“ -f
bewirkt, aber ich verstehe nicht, was „upper case“ -F
bewirkt. Ich wäre dankbar, wenn mir jemand die Unterschiede erklären könnte.
Antwort1
Du beschreibst das GNU- tail
Dienstprogramm. Der Unterschied zwischen diesen beiden Flags besteht darin, dass wenn ich eine Datei, beispielsweise eine Protokolldatei, öffne, sie so aussieht:
$ tail -f /var/log/messages
... und wenn die Protokollrotationsfunktion auf meinem Computer beschließt, diese Protokolldatei zu rotieren, während ich beobachte, wie Nachrichten in die Datei geschrieben werden („rotieren“ bedeutet löschen oder an einen anderen Ort verschieben usw.), wird die Ausgabe, die ich sehe, einfach gestoppt.
Wenn ich die Datei tail
so öffne:
$ tail -F /var/log/messages
... und wieder wird die Datei rotiert, die Ausgabe würde weiterhin in meiner Konsole fließen, weil tail
die Datei wieder geöffnet würde, sobald sie wieder verfügbar wäre, d.h. wenn das Programm, das in das Protokoll schreibt, mit dem Schreiben in dasneu /var/log/messages
.
Auf den freien BSD-Systemen gibt es keine -F
Option, aber tail -f
sie verhalten sich wie tail -F
auf GNU-Systemen, mit dem Unterschied, dass Sie die Meldung erhalten
tail: file has been replaced, reopening.
in der Ausgabe, wenn die von Ihnen überwachte Datei verschwindet und wieder erscheint.
DAS KÖNNEN SIE TESTEN
Führen Sie in einer Shell-Sitzung Folgendes aus:
$ cat >myfile
Jetzt wartet es darauf, dass Sie etwas eingeben. Geben Sie einfach ein paar Zeilen Kauderwelsch ein. Es wird alles in der Datei gespeichert myfile
.
Inein andererShell-Sitzung (vielleicht in einem anderen Terminal,ohne Unterbrechung dercat
):
$ tail -f myfile
Dadurch wird der (Ende des) Inhalts von myfile
in der Konsole angezeigt. Wenn Sie zur ersten Shell-Sitzung zurückkehren und etwas mehr eingeben, wird diese Ausgabe sofort tail
in der zweiten Shell-Sitzung angezeigt.
Beenden Sie nun cat
durch Drücken von Ctrl+Dundentfernendie myfile
Datei:
$ rm myfile
Führen Sie dann die Katze erneut aus:
$ cat >myfile
... und tippe etwas, ein paar Zeilen.
Mit GNU tail
werden diese Zeilennichtwird in der zweiten Shell-Sitzung angezeigt (wo tail -f
es noch ausgeführt wird).
Wiederholen Sie die Übung tail -F
und beobachten Sie den Unterschied.
Antwort2
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, es handelt sich jedoch um einen anderen Inode (und wahrscheinlich an einer anderen Stelle auf Ihrer Festplatte gespeichert). tail -f
fill versucht nicht erneut und lädt den neuen Inode, tail -F
wird dies erkennen.
Derselbe Effekt tritt ein, wenn Sie eine Datei umbenennen/verschieben. Wenn Sie beispielsweise folgen /var/log/messages
und logrotate das Protokoll nach .tail rotiert, hört /var/log/messages.1
tail with weiterhin auf den alten Inode, der auf zeigt . tail with erkennt dies und liest den neuen Inode.-f
messages.1
-F