Supponiamo che tu abbia una pipeline come la seguente:
$ a | b
Se b
interrompe l'elaborazione dello stdin, dopo un po 'la pipa si riempie e scrive, dal a
suo stdout, si bloccherà (fino a quando non b
inizia nuovamente l'elaborazione o muore).
Se volessi evitare questo, potrei essere tentato di usare una pipa più grande (o, più semplicemente, buffer(1)
) in questo modo:
$ a | buffer | b
Questo mi avrebbe semplicemente guadagnato più tempo, ma alla fine si a
sarebbe fermato.
Quello che mi piacerebbe avere (per uno scenario molto specifico a cui mi sto rivolgendo) è avere una pipe "che perde" che, quando piena, lascerebbe cadere alcuni dati (idealmente, riga per riga) dal buffer per far a
continuare elaborazione (come probabilmente si può immaginare, i dati che scorrono nella pipe sono sacrificabili, ovvero avere i dati elaborati da b
è meno importante che a
riuscire a correre senza bloccare).
Per riassumere, mi piacerebbe avere qualcosa come un buffer limitato e che perde:
$ a | leakybuffer | b
Probabilmente potrei implementarlo abbastanza facilmente in qualsiasi lingua, mi stavo solo chiedendo se c'è qualcosa di "pronto all'uso" (o qualcosa come un bash one-liner) che mi manca.
Nota: negli esempi sto usando pipe normali, ma la domanda vale anche per le pipe nominate
Mentre ho assegnato la risposta di seguito, ho anche deciso di implementare il comando leakybuffer perché la semplice soluzione di seguito presentava alcune limitazioni: https://github.com/CAFxX/leakybuffer