"tail -f", das es immer wieder versucht, bis Dateien vorhanden sind

Das Problem mit tail -f

tail -fist sehr nützlich, um das Hinzufügen von Protokolldateien in Echtzeit zu sehen. Es ermöglicht das Ansehen aller Protokolldateien in bestimmten Ordnern, Beispiel:tail -f abc.log mydir/*.log

Probleme:

  • abc.logwird für immer ignoriert, wenn es zum Zeitpunkt des Befehlsstarts nicht existiert (was meistens der Fall ist, da ich normalerweise alle Protokolldateien lösche, bevor ich den Befehl starte tail -f.
  • Der *expandiert nur beim Start, was bedeutet, dass wenn nach 5 Minuten eine neue Datei im Verzeichnis auftaucht, diese ignoriert wird.

Anforderungen

  • Nehmen Sie Dateipfad(e) und Ordnerpfad(e) als Eingabe
  • Den Inhalt dieser Textdateien ausgeben, sobald der Inhalt erscheint (so schnell wie möglich)
  • Prüfen Sie bei Ordnern immer wieder, ob darin neue Dateien angelegt wurden
  • Bei Dateien, die noch nicht existieren, prüfen Sie immer wieder, ob sie erstellt wurden
  • Kostenlos und Open-Source
  • Bonus, wenn gepflegte Deb/RPM-Pakete verfügbar sind, doppelter Bonus, wenn sie in den Kanälen der großen Distributionen vorhanden sind.

Das Tailing mehrerer Dateien könnte zu einer solchen Ausgabe führen, wenn beispielsweise a.log geschrieben wird, dann b.log und dann wieder a.log:

==> a.log <==
bla1
bla2

==> b.log <==
blb1
blb2

==> a.log <==
bla3
bla4

So tailfunktioniert es, aber eine ähnliche Formatierung ist auch in Ordnung.

Keine direkte Empfehlung, was zu allem passt, aber ein "Stichwort", das man sich merken sollte: Wenn Sie möchten, dass neue Dateien berücksichtigt werden, kann iNotify hilfreich sein (wird in den Repositories geliefert). Sie können Ordner oder Dateien auf Änderungen überwachen lassen und eine Aktion ausführen, wenn diese auftreten.
Muss es Software sein? Es ist ziemlich einfach, in Bash zu erstellen. Hier ist die für eine einzelne Datei: while [ ! -f "MyFile" ]; do echo "waiting"; sleep 10; done; tail -f MyFileFür Ihre Anforderung „Für Ordner“ müssen Sie erklären, was passieren soll, wenn/wenn es mehr als eine solche Datei gibt.
@CPerkins: Ja, das wäre akzeptabel! In der Tat war es unklar, ich habe meine Frage bearbeitet.
Alter, das ist fantastisch. Ich benutze bash seit Jahren mumble, benutze tail -f mehr als täglich, und ich habe irgendwie nie gelernt, dass es mit mehreren Dateien umgehen kann.

Antworten (1)

Obwohl die Ausgabe nicht genau wie tail -fist, funktioniert der Multitail- Befehl, der in mehreren Distributionen im gleichnamigen Paket enthalten ist, recht gut. Das Beispiel

multitail  --retry -i abc.log -q 5 'mydir/*.log'

versucht erneut, die erste Datei zu öffnen, und testet alle 5 Sekunden auf neue Dateien, die dem Glob-Muster entsprechen, und tail -fzeigt jede Datei in einem Fenster in Ihrem Terminal an. Es gibt viele Konfigurationsmöglichkeiten.