假设我要并行执行多个程序,并将它们的输出组合到一个管道中:
sh -c '
(echo qqq; echo qqq2; echo qqq3)&
(echo www; echo www2; echo www3)&
(echo eee; echo eee2; echo eee3)&
wait; wait; wait'
这种shell方法在这种简单情况下效果很好,但我希望如果程序以缓冲方式输出越来越长的行,则它会失败,例如:
qqq
qqwww
q2
qqq3www2
wwweee3
eee2
eee3
我被提示使用的解决方案之一是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缺点)进行操作?
您想如何混合输出?显然,您确实想混合输出,因为您需要“睡眠顺序”而不是“参数顺序”。您是否需要混合输出而不是混合行,即以原子方式打印每行?
—
吉尔(Gilles)'所以
逐行。所有启动程序中的所有行都应尽早交付,但不要在每行内部混用。
—
六。
我认为这样做的标准方法是
—
Shadur
syslog……
是否
—
六。
syslog不将日志用于日志,而是将其用于自定义事务?
到目前为止,这并不比其他建议更理想,但我认为值得一提的
—
cpugeniusmv
-s是tail选项。例如,tail -f -s .1 file将循环延迟从默认的1秒减少到0.1秒。