让第二根管道不等待第一根管道完成

让第二根管道不等待第一根管道完成

我有一个名为 的长时间运行的程序my-program,我想在 stdout 中查看日志,但也将它们保存到文件中。我还想在每一行前面添加日期时间。

这就是我正在尝试做的事情:

my-program | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | tee out.log

问题是第二个管道等待第一个管道的输出完成。

为什么要等?我怎样才能让它逐行处理第一个管道的输出?

谢谢

答案1

管道的存在允许应用程序更有效地缓冲其输出。第二个(和第三个)进程确实与第一个进程并行运行,但第一个进程可能无法产生足够的输出来填充缓冲区。

您可以通过使用来解决这个问题stdbuf,但我不建议将其作为每个管道的通用灵丹妙药,因为它强制输出进行行缓冲而不是完全缓冲:

stdbuf -oL my-program | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }' | tee out.log

您可能还需要stdbuf -oL在太前面添加一个awk。首先尝试不使用它,如果需要的话也将其添加到其中。

相关内容