Załóżmy, że chcę wykonywać wiele programów równolegle i łączyć ich wyniki w jeden potok:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Takie podejście do powłoki działa dobrze w tym prostym przypadku, ale spodziewam się, że się nie powiedzie, jeśli programy wypiszą więcej i dłuższe linie w buforowany sposób, tak jak to (zbudowane):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
Jednym z rozwiązań, które mi zalecono użyć było 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)
, ale jest to opcja nieoptymalna: powolnie wysyła dane, nie kończy się; Dane wyjściowe widzę nie w kolejności „uśpienia”, ale w kolejności argumentów w tym przypadku:
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
Mam wdrożony specjalny mały program, ale wierzę, że powinna istnieć jakaś norma dobrym sposobem, aby to zrobić.
Jak to zrobić przy użyciu standardowych narzędzi (i bez tail -f
wad)?
syslog
...
syslog
nie jest używane do dzienników, ale do czegoś niestandardowego, który jest w porządku?
-s
opcji ogona. np. tail -f -s .1 file
zmniejszy opóźnienie pętli do .1 sekundy od domyślnej 1 sekundy.