Wie dupliziert man einen Stream und verarbeitet beide Teile im Streaming-Modus?

Wie dupliziert man einen Stream und verarbeitet beide Teile im Streaming-Modus?

Manchmal möchte ich etwas in eine Pipeline einfügen, um Berichte zu erstellen oder eine andere sekundäre Verwendung zu ermöglichen. Es kann etwas so Einfaches wie sein wc -loder ein komplexeres Biest wie awkoder sogar ein Python-Skript. Es wäre schön, eine Pipeline wie diese auszuführen:

zcat my_data_file.gz \
| wc -l > /tmp/linecount
| process_data.py

Das Problem besteht darin, dass die meisten Dienstprogramme die Daten nicht auf stdout schreiben. teeIch kann die Daten in eine temporäre Datei schreiben, muss dann aber warten, bis alles fertig ist:

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py && \
wc -l /tmp/f > /tmp/linecount && rm /tmp/f

Dies ist nicht optimal: Es kann sich um eine Pipeline mit sehr langer Laufzeit handeln; ich möchte möglicherweise Zwischenergebnisse des Analogons wcfrüher sehen; und ich möchte möglicherweise nicht alle Daten in einer temporären Datei speichern.

Antwort1

Hierzu können Sie teeSubstitutionen einsetzen und verarbeiten :>(...)

zcat my_data_file.gz |

# Count number of lines in stream
tee >(wc -l > /tmp/linecount) |

# Further processing
process_data.py

Beachten Sie, dass Pipes zur Zeilenfortsetzung verwendet werden können und dass Kommentare zwischen Befehlen eingefügt werden können, eine nette Funktion beim Erstellen komplizierter Pipelines.

Antwort2

Es ist nicht ganz effizient, aber Sie können dies erreichen mitBenannte Pipes, die Sie erstellen können mitmkififo(1)

Zum Beispiel in der Frage:

mkfifo /tmp/f

wc -l /tmp/f > /tmp/linecount &

zcat my_data_file.gz \
| tee /tmp/f \
| process_data.py &

wait

rm /tmp/f

Beachten Sie die &an beide und die Pipeline angehängten Befehle wc. Dies bedeutet, dass die Shell die Aufgaben in den Hintergrund verschiebt. Der Aufruf von waitwartet dann, bis alle Hintergrundaufgaben abgeschlossen sind. Beide Prozesse werden ungefähr zur gleichen Zeit beendet.

Bedenken Sie, dass, wenn einer Ihrer Prozesse wesentlich langsamer ist, dies das Ganze erheblich verlangsamen kann, da es teeentweder zu einer Blockierung seiner Standardausgabe-Pipe oder der benannten Pipe, in die er schreibt, kommen kann.Bearbeiten: Außerdem gibt es jetzt mehr Fehlermodi, da T-Shirt aufgrund eines Rohrbruchs beendet wird, wenn Ihr sekundärer Prozess fehlschlägt.

verwandte Informationen