Supposons que je veuille exécuter plusieurs programmes en parallèle et combiner leurs sorties dans un seul canal:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
Cette approche shell fonctionne bien pour ce cas simple, mais je m'attends à ce qu'elle échoue si les programmes produisent plus de lignes plus longues de manière tamponnée, comme ceci (construit):
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
L'une des solutions que j'ai été suggéré d'utiliser était 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)
, mais cette option n'est pas optimale: elle produit des données lentement, elle ne se termine pas; Je vois les sorties non pas dans l'ordre "sleep", mais dans l'ordre des arguments dans ce cas:
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
J'ai mis en place un petit programme spécial pour cela, mais je pense qu'il devrait y avoir un bon moyen standard de le faire.
Comment le faire en utilisant des outils standards (et sans tail -finconvénient)?
syslog...
syslogn'est-elle pas pour les journaux, mais pour quelque chose de personnalisé considéré comme OK?
-soption pour la queue. Par exemple tail -f -s .1 file, le délai de boucle sera réduit à 0,1 seconde par rapport à la valeur par défaut de 1 seconde.