Nehmen wir an, Sie haben eine Pipeline wie die folgende:
$ a | b
Wenn bdie Verarbeitung von stdin beendet wird, füllt sich die Pipe nach einer Weile und Schreibvorgänge von abis zu ihrem stdout werden blockiert (bis entweder bdie Verarbeitung erneut beginnt oder sie stirbt).
Wenn ich dies vermeiden wollte, könnte ich versucht sein, ein größeres Rohr (oder einfacher buffer(1)) wie folgt zu verwenden :
$ a | buffer | b
Das würde mir einfach mehr Zeit verschaffen, aber am Ende awürde es irgendwann aufhören.
Was ich gerne hätte (für ein sehr spezifisches Szenario, das ich anspreche), wäre eine "undichte" Pipe, die, wenn sie voll ist, einige Daten (idealerweise zeilenweise) aus dem Puffer löscht, um afortzufahren Verarbeitung (wie Sie sich wahrscheinlich vorstellen können, sind die Daten, die in der Pipe fließen, entbehrlich, dh es bist weniger wichtig , dass die Daten von verarbeitet werden, als dass asie ohne Blockierung ausgeführt werden können).
Um es zusammenzufassen, ich hätte gerne so etwas wie einen begrenzten, undichten Puffer:
$ a | leakybuffer | b
Ich könnte es wahrscheinlich ganz einfach in jeder Sprache implementieren. Ich habe mich nur gefragt, ob mir etwas "gebrauchsfertiges" (oder so etwas wie ein Bash-Einzeiler) fehlt.
Hinweis: In den Beispielen verwende ich reguläre Pipes, aber die Frage gilt auch für Named Pipes
Während ich die folgende Antwort erhielt, entschied ich mich auch, den Befehl leakybuffer zu implementieren, da die einfache Lösung unten einige Einschränkungen aufwies: https://github.com/CAFxX/leakybuffer