【问题标题】:How to make line buffering work when pipelining stderr?流水线stderr时如何使行缓冲工作?
【发布时间】:2015-11-14 07:46:33
【问题描述】:

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

#!/bin/sh

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

实用程序 ts 添加时间戳(我也尝试使用 bash 代码来实现这一点)。 stdbuf 在此管道中使用时不运行。当移除管道并仅重定向 stderr 而不添加时间戳时,它可以正常工作。

知道如何解决它吗?

【问题讨论】:

  • 为什么要行缓冲输出?我的意思是你正在重定向到一个文件。
  • @nick 你能详细说明一下你那里的continuously_running_command 是什么吗?如果我在 stdoutstderr 中用一个小的无限循环打印来提供它,它就可以正常工作。
  • @hek2mgl 我想要行缓冲输出的原因是因为如果程序终止,最后一行不会保存。
  • @sokin 我正在运行的程序是rtmpdump,一个视频流捕获程序。
  • @Nick 当程序终止时,输出缓冲区将被刷新。如果你错过了一些行,那不是缓冲的问题。

标签: linux bash shell unix pipeline


【解决方案1】:

也许问题在于使用的缓冲模式:

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

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

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

如果 MODE'0',则相应的流将被取消缓冲。

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

【讨论】:

  • 我也使用了 L 选项。
  • 您可以尝试通过将标准错误重定向到/dev/null 来解决问题,看看它是否有所作为。
猜你喜欢
  • 2013-05-12
  • 2012-09-02
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多