Dies ist in etwa soSo starten Sie das Tailing einer Datei, die noch nicht erstellt wurdemit einer Wendung: Eine Datei mit diesem Namen existiert bereits.
Ich habe ein Programm, das mehrmals ausgeführt wird. Wenn der Name der Ausgabedatei bereits verwendet wird, benennt es die vorhandene Datei um, indem es _XYZ
vor der Dateierweiterung Folgendes einfügt: wobei XYZ
die kleinste Ganzzahl ist (z.B, output.out
wird output_001.out
, oder output_002.out
wenn output_001.out
bereits vorhanden ist usw.) und erstellt eine neue Ausgabedatei mit dem primären Namen.
Wenn ich den primären Namen anhänge, selbst mit -F
, beginnt es sofort mit dem Anhängen der vorhandenen Datei und behält den Handle zu diesem Inode bei, selbst wenn die Datei umbenannt wird, und ignoriert die neue Datei.
Das Programm wird auf einem gemeinsam genutzten Cluster mit Warteschlangenverwaltung ausgeführt, sodass die Ausführung mit langen und variablen Verzögerungen beginnt.
Ist es überhaupt möglich, die neue Datei zu verfolgen, ohne darauf zu warten, dass sie zuerst erstellt wird? Und wenn ja, wie?
Antwort1
tail -F
sollte dies bereits tun.
Erstellen Sie eine leere /tmp/t/file
. Starten Sie dann in Terminal 1 tail -F
und lassen Sie es laufen:
anthony@Zia:~$ tail -F /tmp/t/file
a
b
tail: `/tmp/t/file' has become inaccessible: No such file or directory
tail: `/tmp/t/file' has appeared; following end of new file
c
d
Im Terminal 2 habe ich Folgendes gemacht:
anthony@Zia:/tmp/t$ echo a >> file
anthony@Zia:/tmp/t$ echo b >> file
anthony@Zia:/tmp/t$ mv -i file file.old; echo c >> file
anthony@Zia:/tmp/t$ echo d >> file
Wie Sie sehen, tail -F
folgt tatsächlich dem Namen, nicht dem Inode. Vielleicht verwenden Sie ein , tail
das eine andere Bedeutung hat (dieses Flag ist eine BSD-Erweiterung, die später auch von GNU kopiert wurde), oder Ihre Version ist fehlerhaft? Sie könnten auch (alternative Syntax für GNU-Tail) oder (das ein ganzes Verzeichnis tailt) -F
versuchen .tail --follow=name --retry
xtail