Nehmen wir an, Sie haben eine Pipeline wie die folgende:
$ a | b
Wenn b
die Verarbeitung von stdin beendet wird, füllt sich die Pipe nach einer Weile und Schreibvorgänge von a
bis zu ihrem stdout werden blockiert (bis entweder b
die 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 a
wü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 a
fortzufahren Verarbeitung (wie Sie sich wahrscheinlich vorstellen können, sind die Daten, die in der Pipe fließen, entbehrlich, dh es b
ist weniger wichtig , dass die Daten von verarbeitet werden, als dass a
sie 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