Ich führe ein Shell-Skript aus, das Daten von einem Prozess zu einem anderen leitet
process_a | process_b
Kennt jemand einen Weg, um herauszufinden, wie viele Bytes zwischen den beiden Programmen übertragen wurden? Die einzige Lösung, die ich mir im Moment vorstellen kann, wäre, ein kleines c-Programm zu schreiben, das von stdin liest, in stdout schreibt und alle übertragenen Daten zählt, wobei die Anzahl in einer Umgebungsvariablen gespeichert wird, wie:
process_a | count_bytes | process_b
Hat jemand eine ordentlichere Lösung?
exec
und direkt in die Datei ausgeben?input-command | dd 2>~/fred | output-command
Verwendung pv das Rohr Betrachter. Es ist ein großartiges Werkzeug. Sobald Sie davon erfahren, werden Sie nie wissen, wie Sie ohne es gelebt haben.
Es kann auch einen Fortschrittsbalken und die Übertragungsgeschwindigkeit anzeigen.
quelle
cat file | pv -b
Gibt die Größe der Datei zurück.process_a | tee >(process_b) | wc --bytes
könnte funktionieren. Sie können dann diewc
Zählung dahin umleiten , wo immer Sie sie benötigen. Wennprocess_b
irgendetwas anstdout
/stderr
ausgegeben wird, müssen Sie dies wahrscheinlich irgendwo umleiten, wenn nur/dev/null
.Für ein leicht erfundenes Beispiel:
Zur Erklärung:
tee
Ermöglicht die direkte Ausgabe in mehrere Dateien (plus stdout) und das>()
Konstrukt ist die "Prozessersetzung" von bash, wodurch ein Prozess in diesem Fall wie eine Nur-Schreib-Datei aussieht, sodass Sie sowohl zu Prozessen als auch zu Dateien umleiten können ( siehe hier , oder diese Frage + Antwort für ein Beispiel der Verwendung vontee
Ausgabe zu vielen Prozesse zu senden).quelle
Ich weiß, dass ich zu spät zur Party komme, aber ich glaube, ich habe eine gute Antwort, die diesen nützlichen Thread verbessern kann.
Dies ist eine Mischung aus @Phil P und @David Spillett, aber:
Die Anzahl der Bytes wird zusammen mit der Ausgabe von process_b auf stdout ausgegeben.
Sie können ein Präfix verwenden, um die Zeile zu identifizieren, die Bytes enthält, wenn Sie mit der Ausgabe arbeiten (
Bytes:
im Beispiel).WARNUNG: Verlassen
Sie sich nicht auf die Reihenfolge der Zeilen in der Ausgabe.
Die Reihenfolge ist unvorhersehbar und kann immer unterschiedlich sein, auch wenn dasselbe Skript mit denselben Parametern aufgerufen wird!
quelle