März 6

Unbuffered Output bei vielen Pipes (z.B. mehrere grep’s)

Für eine übersichtliche Ausgabe eines Logs (in diesem Fall DNS-Queries) habe ich mir einen
Befehl mit einem cut und 2 grep’s gebaut, der mir nur Uhrzeit und angefragte Domain
ausgeben soll.

Das Problem: sobald mehrere Pipes im Spiel sind, kommt die Ausgabe nur sehr „wellenartig“,
also viele Zeilen auf einmal, statt der normalen live Ausgabe Zeile für Zeile:

buffered_output

Der Grund: jede hier genutzte Pipe buffered seinen Output und mit jedem weiteren grep, cut, usw.
wird das Delay zwischen Verarbeitung und Ausgabe höher. Von einer Live-Ausgabe kann man
bei vielen Pipes dann kaum noch sprechen.
Es gibt allerdings eine Lösung, die nahezu jede Shell schon mit an Board hat:
stdbuf -o0
wird einfach vor jeden Befehl der Pipes gesetzt, um den Buffer auf 0 zu setzen. Ein Beispiel:
tail -f /var/log/named/bind-queries.log | stdbuf -o0 cut -d " " -f 2,8-10 | stdbuf -o0 grep -v 127.0.0.1
… und schon ist die Ausgabe wieder wie gewünscht und pro Zeile:
unbuffered_output


Schlagwörter: , ,

Veröffentlicht6. März 2016 von gerger in Kategorie "Allgemein

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.