Ich habe ein Programm, das bei jedem Durchlauf eine neue Logdatei erzeugt. Um zu sehen, was passiert, würde ich gerne auf tail -f
das Log zugreifen – das Problem ist nur, dass ich den Dateinamen im Vorhinein nicht kenne.
Gibt es also eine Möglichkeit, alle Dateien zu verfolgen, die einem bestimmten (Shell-Glob-)Muster entsprechen? Ich schätze, ich könnte so etwas leicht skripten, frage mich aber, ob es bereits eine Lösung dafür gibt.
Antwort1
Ich glaube nicht, dass es eine direkte Möglichkeit gibt, dies zu tun, tail
ohne den Namen zu kennen. Wenn Sie ihn kennen würden, tail --follow=name --retry
würde es funktionieren und auf das Erscheinen der Datei warten und dann mit der Verfolgung beginnen.
Ich würde vorschlagen, ein kleines Shell-Skript zu schreiben, das inotifywait
auf das Erscheinen der Datei wartet und tail -f
ihr dann folgt.
Antwort2
Wenn Sie den Dateinamen nicht im Voraus kennen:
- Entscheiden Sie sich für einen Dateinamen, wie
foo.log
- beobachten Sie diese Datei:
tail -F foo.log
(egal ob foo existiert oder nicht) - Verwenden Sie ein Tool, um das Verzeichnis auf Dateiänderungen zu überwachen und einen Befehl auszuführen
Für den Befehl entweder:
- Verschieben Sie die neue Datei, um foo.log zu überschreiben
mv the_new_file_which_appeared foo.log
(wenn die App-Protokollierung einmal geöffnet wird, funktioniert dies problemlos). - oder einfach einen symbolischen Link:
ln -s the_new_file_which_appeared foo.log
- und das Ende sollte das erfassen.
Um die Verzeichnisse richtig zu überwachen (Schritt 3), benötigen Sie ein konfigurierbares, cleveres Tool.
Persönlich würde ich verwendenBewachenmit demGuard::Prozess.
In der Praxis ist Guard nicht viel schwerer als die Verwendung von Shell-Skripten (es ist eine dünne Schicht über inotify unter Linux) und die Einrichtung ist sehr schnell und einfach.