Die Überwachung mehrerer Dateien mit Unix-Tail funktioniert möglicherweise nicht so, wie Sie es erwarten.
von Allen Fung, Senior Software Engineer (Senior)
"tail -F" wird häufig verwendet, um Dateien auf Updates zu überwachen.
Hier erfahren Sie, wie Sie mit dem Tail mehrere Dateien gleichzeitig überwachen können.
$ tail -F file1 file2 file2
Das Problem mit dem obigen Befehl ist, dass der in file1 und file2 geschriebene Text möglicherweise nicht an neuen Zeilengrenzen auf die Festplatte geschrieben wird. Infolgedessen konnte Text aus einer Datei in Text aus der anderen Datei in der Ausgabe von tail eingefügt werden.
Hier ist ein Beispiel für das Problem. Angenommen, das Folgende wird in Datei1 geschrieben.
Linie_1
Linie_2
line_3
Angenommen, das Folgende wird in Datei2 geschrieben.
LINE_A
LINE_B
LINE_C
Wenn Text an neuen Linienbegrenzungen nicht gespült wird, ist es möglich, die folgende Ausgabe von tail zu erhalten.
lineLINE_A
_1
LINE_B
Linie_2
LINE_C
line_3
Wie Sie sehen können, wird "LINE_A" in "line_1" gespleißt, was in der ersten Zeile zu "lineLINE_A" führt. Hier sind ein paar Möglichkeiten, das Problem zu lösen.
Lassen Sie mehrere Tails parallel laufen und leiten Sie die Ausgabe jedes Tails an grep. Sie müssen die Option in grep verwenden, um nur an neuen Linienbegrenzungen zu drucken.
Schreiben Sie einen neuen Schwanz, der nur druckt, wenn er eine komplette Zeile aus einer Datei erhält.
Ändern Sie die Anwendung, die die Protokolldateien generiert hat, um nur eine einzige Protokolldatei zu erstellen. Sie müssen sicherstellen, dass der Text an neuen Zeilengrenzen in die einzelne Datei geschrieben wird.
Hier ist der Code, den Sie oben (1) implementieren müssen.
$ vi multi-tail.sh
#!/bin/sh
# Wenn dies beendet wird, verlassen Sie auch den gesamten Hintergrundprozess.
trap'kill $(jobs -p)' EXIT
# iterieren durch jeden der angegebenen Dateinamen
für die Datei in "$@".
tun
# Tail file in background.
tail -F $file | grep -line-gepuffert "" &
erledigt
# wait ... bis STRG+C
warten
Ich überlasse es dem Leser, (2) und (3) zu implementieren.
Danke fürs Lesen!