Angenommen, ich möchte mehrere Programme parallel ausführen und ihre Ausgaben zu einer Pipe kombinieren:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Dieser Shell-Ansatz funktioniert in diesem einfachen Fall gut, aber ich erwarte, dass er fehlschlägt, wenn Programme mehr und längere Zeilen gepuffert ausgeben, wie folgt (konstruiert):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
Eine der Lösungen, die ich verwenden sollte, war 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)
Dies ist jedoch eine nicht optimale Option: Sie gibt Daten nur schleppend aus und wird nicht beendet. Ich sehe die Ausgaben nicht in der Reihenfolge "Schlaf", sondern in der Reihenfolge der Argumente in diesem Fall:
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
Ich habe ein spezielles kleines Programm dafür implementiert , glaube aber, dass es einen Standard-guten Weg geben sollte, dies zu tun.
Wie geht das mit Standardwerkzeugen (und ohne tail -f
Nachteil)?
syslog
...
syslog
nicht für Protokolle, sondern für etwas Benutzerdefiniertes als OK angesehen?
-s
Option für den Schwanz zu erwähnen . zB tail -f -s .1 file
reduziert die Schleifenverzögerung von 1 Sekunde auf 0,1 Sekunden.