Unterdrücken Sie "Datei abgeschnitten" -Nachrichten, wenn Sie tail verwenden

11

Ich beschließe eine Protokolldatei mit tail -f messages.logund dies ist Teil der Ausgabe:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Fusce eget tellus sit amet odio porttitor rhoncus. 
Donec consequat diam sit amet tellus viverra pellentesque. 
tail: messages.log: file truncated
Suspendisse at risus id neque pharetra finibus in facilisis ipsum.

Es zeigt an, tail: messages.log: file truncatedwann die Datei automatisch abgeschnitten wird und das soll passieren, aber ich möchte tailmir nur die Ausgabe ohne diese Nachricht zum Abschneiden zeigen.

Ich habe es versucht, tail -f messages.log | grep -v truncatedaber es zeigt mir trotzdem die Nachricht.

Gibt es eine Methode, um diese Nachricht zu unterdrücken?

Bas Peeters
quelle

Antworten:

15

Diese Nachricht wird wie alle Warn- und Fehlermeldungen auf stderr ausgegeben .

Sie können entweder die gesamte Fehlerausgabe löschen:

tail -f file 2> /dev/null

Oder um nur die Fehlermeldungen herauszufiltern, die Folgendes enthalten truncate:

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

Das bedeutet jedoch, dass Sie den Exit-Status von verlieren tail. Einige Shells haben eine pipefailOption (aktiviert mit set -o pipefail) für diese Pipeline, um den Exit-Status zu melden, tailwenn dies fehlschlägt. zshund bashkann auch den Status einzelner Komponenten der Pipeline in ihrem $pipestatus/ $PIPESTATUSArray melden .

Mit zshoder bashkönnen Sie verwenden:

tail -f file 2> >(grep -v truncated >&2)

Beachten Sie jedoch, dass auf den grepBefehl nicht gewartet wird, sodass die Fehlermeldungen nach dem Beenden möglicherweise angezeigt werden tailund die Shell bereits mit der Ausführung des nächsten Befehls im Skript begonnen hat.

In zshkönnen Sie das ansprechen, indem Sie es schreiben:

{ tail -f file; } 2> >(grep -v truncated >&2)

Dies wird in der zshDokumentation unter info zsh 'Process Substitution':

Es gibt ein zusätzliches Problem mit >(PROCESS); Wenn dies an einen externen Befehl angehängt ist, wartet die übergeordnete Shell nicht auf den Abschluss von PROCESS. Daher kann sich ein unmittelbar folgender Befehl nicht darauf verlassen, dass die Ergebnisse vollständig sind. Das Problem und die Lösung sind die gleichen wie im Abschnitt MULTIOS im Hinweis Redirection :: beschrieben . Daher in einer vereinfachten Version des obigen Beispiels:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(Beachten Sie, dass keine MULTIOS beteiligt sind.) PROCESS wird in Bezug auf die übergeordnete Shell asynchron ausgeführt. Die Problemumgehung lautet:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

Die zusätzlichen Prozesse hier werden von der übergeordneten Shell erzeugt, die auf ihren Abschluss wartet.

Stéphane Chazelas
quelle
Gibt es einen Grund, warum Sie eine Unterschale ( )einem komplexen Befehl vorziehen { }?
Tom Hale
@ TomHale. Kein guter Grund. Siehe Bearbeiten. Vielen Dank.
Stéphane Chazelas
2

Wenn grepdie Ausgabe nicht entfernt wird, wird sie höchstwahrscheinlich auf Standardfehler gedruckt. Der einfachste Weg, dies loszuwerden, besteht darin, es einfach zu entsorgen:

tail -f messages.log 2>/dev/null
l0b0
quelle
1
Macht den Trick, unterdrückt aber auch andere Meldungen.
Bas Peeters
Ja, @ StéphaneChazelas hat eine Lösung, die komplexer ist, aber nur die relevante Nachricht ignoriert.
10.
1

Vielleicht helfen, wenn der Ursprung dieses Fehlers behoben werden kann. Es ist passiert, weil etwas mit Überschreiben ">" in eine Datei geschrieben wurde, nicht mit ">>".

BG Bruno
quelle