Supposons que vous ayez un pipeline comme celui-ci:
$ a | b
Si b
arrête le traitement stdin, après un certain temps, le tuyau se remplit et écrit, de a
à sa sortie standard, se bloquera (jusqu'à ce que le b
traitement recommence ou qu'il meure).
Si je voulais éviter cela, je pourrais être tenté d'utiliser un tuyau plus gros (ou, plus simplement buffer(1)
) comme ceci:
$ a | buffer | b
Cela me ferait simplement gagner plus de temps, mais a
finirait par s'arrêter.
Ce que j'aimerais avoir (pour un scénario très spécifique que j'aborde), c'est d'avoir un tuyau "qui fuit" qui, une fois plein, laisserait tomber certaines données (idéalement, ligne par ligne) du tampon pour laisser a
continuer traitement (comme vous pouvez probablement l'imaginer, les données qui circulent dans le tuyau sont extensibles, c'est-à-dire que le traitement des données b
est moins important que de a
pouvoir fonctionner sans blocage).
Pour résumer, j'aimerais avoir quelque chose comme un tampon délimité et qui fuit:
$ a | leakybuffer | b
Je pourrais probablement l'implémenter assez facilement dans n'importe quelle langue, je me demandais juste s'il y avait quelque chose de "prêt à l'emploi" (ou quelque chose comme un bash one-liner) qui me manque.
Remarque: dans les exemples, j'utilise des tuyaux normaux, mais la question s'applique également aux tuyaux nommés
Bien que j'aie attribué la réponse ci-dessous, j'ai également décidé d'implémenter la commande leakybuffer car la solution simple ci-dessous avait certaines limites: https://github.com/CAFxX/leakybuffer