Gibt es eine Möglichkeit, die Rohrkapazität von Rohren festzulegen, die in einem Bash-Skript (oder einem anderen Shell-Skript) definiert sind? Nehmen Sie z
cmd1 | cmd2
In neueren Linux-Versionen ist die Pipe-Kapazität standardmäßig auf 64 KB eingestellt. Ich weiß, dass ich die zwischen den beiden Prozessen "gepufferte" Datenmenge auf zwei Arten steuern kann:
- Verwenden von
buffer(1)
: zcmd1 | buffer | cmd2
- Verwendung
fcntl(2)
mit derF_SETPIPE_SZ
Flagge von innencmd1
odercmd2
Jede Lösung hat Nachteile: buffer
Kann nur zum Erhöhen des Puffers verwendet werden; Für Schreibvorgänge über die Standard-Pipe-Kapazität muss der Downstream-Befehl weiterhin aktiviert werden. fcntl
kann, soweit ich weiß, nur von innen cmd1
oder von innen aufgerufen werden cmd2
.
Meine Frage ist: Gibt es eine Möglichkeit, wenn die Shell das Rohr erstellt, in der Shell anzugeben, wie viel Kapazität das Rohr haben soll?
Antworten:
Wenn Ihr Ziel nicht darin besteht, den Downstream-Befehl zu oft zu aktivieren, haben Sie versucht, die
-p
Option zu verwendenbuffer
? Es sollte dazu führenbuffer
, dass Schreibvorgänge angehalten werden, bis der Puffer zu einem bestimmten Prozentsatz gefüllt ist. Möglicherweise benötigen Sie auch die-s
Option, um große Blöcke zu schreiben.Update: Oh, die Pipes zwischen den Befehlen schränken die Dinge immer noch ein. Versuchen Sie möglicherweise, das folgende Adapterprogramm zu verwenden:
wie in:
oder auch:
wenn
cmd1
noch kleine schreibt.quelle
buffer
.cmd1
kann nicht mehr als 64 KB (die Pipe-Kapazität) schreiben, bevorbuffer
es aufwachen muss. Und das gilt natürlich auch zwischenbuffer
undcmd2
, da die Rohrkapazität immer 64KB beträgt.Aufgrund der Vorschläge von DepressedDaniel und Stéphane Chazelas entschied ich mich für das, was einem Oneliner am nächsten kam:
Dies ermöglicht Folgendes:
und die Pipe zwischen den beiden Befehlen wird die Kapazität haben, die über das
fcntl
im Perl-Skript angegebene angegeben ist.quelle