Wie funktioniert der Parameter "-f" des Befehls "tail"?

59
$ tail -f testfile

Der Befehl soll die neuesten Einträge in der angegebenen Datei in Echtzeit anzeigen, oder? Aber das passiert nicht. Bitte korrigieren Sie mich, wenn das, was ich vorhabe, falsch ist ...

Ich habe eine neue Datei "aaa" erstellt, eine Textzeile hinzugefügt und diese geschlossen. Geben Sie dann den folgenden Befehl ein (erste Zeile):

$ tail -f aaa
xxx
xxa
axx

Die letzten drei Zeilen sind der Inhalt der Datei aaa. Jetzt, da der Befehl noch ausgeführt wird (seitdem ich ihn verwendet habe -f), habe ich die Datei aaa über die GUI geöffnet und manuell ein paar weitere Zeilen hinzugefügt. Das Terminal zeigt jedoch nicht die neuen Zeilen an, die in der Datei hinzugefügt wurden.

Was ist hier los? Der tail -fBefehl zeigt neue Einträge nur an, wenn sie nur vom System geschrieben wurden. (wie Protokolldateien usw.)

da ich bin
quelle

Antworten:

62

Von der tail(1) Manpage :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Ihr Texteditor benennt oder löscht die ursprüngliche Datei und speichert die neue Datei unter demselben Dateinamen. Verwenden Sie -Fstattdessen.

Ignacio Vazquez-Abrams
quelle
hat funktioniert! Also kann ich den $ tail -F filenameBefehl die ganze Zeit benutzen, anstatt $ tail -f filenamerichtig?
its_me
17
Wenn das dein beabsichtigtes Verhalten ist. Es mag Fälle geben, in denen Sie anstelle des Dateinamens den Deskriptor verwenden möchten, aber um fair zu sein, ich bin nicht auf viele davon gestoßen.
Ignacio Vazquez-Abrams
lsofkann dies anzeigen - würde zum Beispiel lsof -Fpcftnianzeigen, dass der Inode, auf den gefolgt tailwird, nicht mehr derselbe ist, den der Editor geöffnet hat.
Aaron D. Marasco
10

Ihr Editor hat einen eigenen Puffer für die Datei. Wenn Sie den Text im Editor ändern, wird nichts in die Datei selbst geschrieben.

Wenn Sie Ihre Änderungen speichern, löscht der Editor möglicherweise einfach die alte Datei und erstellt eine neue. tail -fwird weiterhin mit der gelöschten Datei verbunden, sodass nichts Neues angezeigt wird.

Stéphane Gimenez
quelle
1
Der Editor überschreibt die Datei, die Protokolle hängen den Text an. Das könnte das Problem sein.
Rufo El Magufo
@ Juan: Ich verstehe deinen Kommentar nicht. "Überschreiben" hat keine konkrete Bedeutung außer der, die ich in meiner Antwort beschrieben habe.
Stéphane Gimenez
Ja, ich meinte dasselbe wie du :)
Rufo El Magufo
3

tail "Aktualisieren" Sie standardmäßig alle 1 Sekunde, nicht in Echtzeit.

Probieren Sie dies aus (Sie brauchen bash4):

  • 2 Klemmen öffnen.
  • Im ersten Terminal führen Sie touch ~/output.txtund aus tail -f ~/output.txt.
  • Im zweiten Terminal ausführen for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Schauen Sie sich die Ausgabe des Schwanzes im ersten Terminal an.
Rufo El Magufo
quelle
Meinten Sie echo $i >> ~/output.txt? Auch diese Antwort verfehlt den Punkt der Frage.
Ignacio Vazquez-Abrams
1
Ja, ich habe das Problem behoben, während du den Kommentar geschrieben hast :). Meine Antwort ist nur ein Test für das Problem. Der Befehl tail -f zeigt nur dann neue Einträge an, wenn sie nur vom System geschrieben wurden.
Rufo El Magufo
4
@ Juan: Heutzutage hat Linux tailfeine inotify-basierte Implementierung. So wird es in Echtzeit aktualisiert.
Stéphane Gimenez
Ja tailf, aber tailverwendet inotify ?. Ich wusste es nicht tailf. Die Manpage von tail zeigt die Standardeinstellung von 1 Sekunde für -s.
Rufo El Magufo
3
Ja, tailgefolgt von und verwendet jetzt auch inotify, wenn verfügbar. tailffragt überhaupt nicht ab, sondern schläft nur, wenn in der Datei keine Aktivität vorhanden ist. tail -fzeigt eine Aktivität (siehe straceAusgabe).
Stéphane Gimenez