Supponiamo che io voglia eseguire più programmi in parallelo e combinare i loro output su una pipe:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Questo approccio alla shell funziona bene per questo semplice caso, ma mi aspetto che fallisca se i programmi producono più e più linee in modo bufferizzato, come questo (costruito):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
Una delle soluzioni che mi è stato suggerito di usare è stata tail -f
:
tail -n +0 -q -f <(echo qqq; echo qqq2; echo qqq3) <(echo www; echo www2; echo www3) <(echo eee; echo eee2; echo eee3)
, ma questa è un'opzione non ottimale: genera dati in modo lento, non termina; Vedo le uscite non in ordine di "sospensione", ma in ordine di argomenti in questo caso:
tail -n +0 -q -f <(sleep 1; echo qqq; sleep 1; echo qqq2; echo qqq3) <(echo www; echo www2; sleep 10; echo www3) <(echo eee; sleep 4; echo eee2; echo eee3) | cat
Ho implementato un piccolo programma speciale per questo, ma credo che ci dovrebbe essere un buon modo standard per farlo.
Come farlo utilizzando strumenti standard (e senza tail -f
svantaggi)?
syslog
...
syslog
non è per i registri, ma per qualcosa di personalizzato considerato OK?
-s
opzione per la coda. ad es. tail -f -s .1 file
ridurrà il ritardo del loop a .1 secondi dal 1 secondo predefinito.