複数のプログラムを並行して実行し、それらの出力を1つのパイプに結合したいとします。
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
このシェルアプローチは、この単純なケースではうまく機能しますが、プログラムが次のように、バッファされた方法でより多くの長い行を出力する場合は失敗すると予想されます(構成されています)。
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
私が使用するように示唆された解決策の1つは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)
が、これは次善のオプションです。データを遅く出力し、終了しません。「スリープ」順ではなく、この場合は引数順に出力が表示されます。
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
私はこれのために特別な小さなプログラムを実装しましたが、それを行うにはいくつかの標準的な良い方法があるはずだと信じています。
標準的なツールを使用して(そしてtail -f不利な点なしに)どうやって行うのですか?
syslog…
syslogログではなく、カスタムで問題ないと思われるものを使用していますか?
-s、尾のオプションについて言及する価値があると思いました。たとえばtail -f -s .1 file、ループ遅延をデフォルトの1秒から0.1秒に減らします。