![让第二根管道不等待第一根管道完成](https://linux22.com/image/213451/%E8%AE%A9%E7%AC%AC%E4%BA%8C%E6%A0%B9%E7%AE%A1%E9%81%93%E4%B8%8D%E7%AD%89%E5%BE%85%E7%AC%AC%E4%B8%80%E6%A0%B9%E7%AE%A1%E9%81%93%E5%AE%8C%E6%88%90.png)
我有一个名为 的长时间运行的程序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
。首先尝试不使用它,如果需要的话也将其添加到其中。