流水线stderr时如何使线路缓冲工作?

时间:2015-11-14 07:46:34

标签: linux bash shell unix pipeline

我想要实现的是在日志文件中的每一行之前添加时间戳。日志文件接收 stdout stderr

#!/bin/sh

stdbuf -o0 -e0 continuously_running_command 2>&1 | stdbuf -o0 -e0 ts >> log_file

实用程序 ts 添加了时间戳(我也尝试使用bash代码实现此目的)。在此管道中使用 stdbuf 时,它不起作用。删除管道并仅重定向 stderr 而不添加时间戳时,它可以正常工作。

有关如何修复它的想法吗?

1 个答案:

答案 0 :(得分:0)

问题可能与使用的缓冲模式有关:

stdbuf -o0 -e0 continuously_running_command 2>&1 | stdbuf -o0 -e0 ts >> log_file

根据stdbuf手册页,您选择的0可能会让标准输出和标准错误以意想不到的方式混合在一起:

  

如果 MODE 'L',则相应的流将进行行缓冲。标准输入时此选项无效。

     

如果 MODE '0',则相应的流将无缓冲。

当无缓冲时,这意味着从应用程序写入除了实线之外的任何内容更有可能导致在任一流上写入部分行。程序在部分中编写错误消息(例如文件名,然后是消息)的情况并不少见。使用行缓冲减少了混合不完整行的可能性。