Ich möchte eine Reihe unbekannter Verzeichnisnamen verfolgen, die eine bestimmte nicht vorhandene Datei enthalten, z. B.:
tail -F /tmp/*/app.log
Mit dem Platzhalter funktioniert das jedoch nicht wie vorgesehen: Wenn ich eine Datei mit diesem Pfad erstelle, tail
wird die Ausführung erst gestartet, wenn ich den Befehl neu starte. Wenn ich hingegen Folgendes ausführe:
tail -F /tmp/example/app.log
Sobald die Datei erscheint, gibt der Befehl Folgendes aus:tail: '/tmp/example/app.log' has appeared; following new file
Ich habe -f filename --retry
stattdessen die Kombination ausprobiert -F
und das Ergebnis ist das gleiche.
Wie kann das Problem gelöst werden und gibt es andere Möglichkeiten, das gleiche Ziel zu erreichen?
Antwort1
/tmp/*/app.log
wird von der Shell erweitert (ich nehme an, BASH). Wenn Übereinstimmungen vorhanden sind, wird dies auf diese Übereinstimmungen erweitert und dann als Argumente antail
$ find /tmp/test -type f
/tmp/test/a/app.log
/tmp/test/b/app.log
$ echo /tmp/test/*/app.log
/tmp/test/a/app.log /tmp/test/b/app.log
Im obigen Fall tail
würde also so konfiguriert, dass speziell app.log
in a
und app.log
in befolgt wird. Wenn in b
zum Zeitpunkt des Starts nicht existierte, würde es nicht befolgt. Wenn neue Verzeichnisse oder Dateien erstellt werden, wird es ihnen ebenfalls nicht folgen.app.log
b
Falls keine Übereinstimmungen vorliegen, wird die nicht erweiterte Zeichenfolge als Argument antail
$ echo /tmp/test/*/app2.log
/tmp/test/*/app2.log
Es wird also versucht, dem wörtlichen Pfadnamen/Dateinamen zu folgen /tmp/test/*/app2.log
, der wahrscheinlich nie existieren wird (oder wenn er existiert, wurde er auf sehr merkwürdige Weise erstellt, denn die Verwendung *
als Verzeichnisname ist nichts, was ich unter normalen Umständen empfehlen würde).