【问题标题】:Bash output stream write to a fileBash 输出流写入文件
【发布时间】:2012-04-02 21:11:32
【问题描述】:

所以我在 bash 上运行它:

# somedevice -getevent

这个命令的作用是它一直运行,每次我的设备发送某个数据,比如它检测到温度变化,它就会输出类似这样的东西

/dev/xyz: 123 4567 8910112238 20
/dev/xyz: 123 4567 8915712347 19
/dev/xyz: 123 4567 8916412345 22
/dev/xyz: 123 4567 8910312342 25
/dev/xyz: 123 4567 8910112361 18
/dev/xyz: 123 4567 8910112343 20

这只是继续运行,一旦有任何原因,它就会输出一些东西。所以执行没有尽头。

没有 echo 工作正常,但是当我尝试使用 '>' 运算符时,这似乎没有写入文件。

比如

#somedevice -getevent > my_record_file

这不能正常工作,my_record_file 只能在 间隔 中将数据写入其中,但我想立即写入。

有什么想法吗?

【问题讨论】:

  • 延迟可能是由于输出缓冲。您可以更改程序以在每次打印后执行 flush() 或在其标准输出上设置自动刷新吗?
  • 好的,我想出了一个解决我的问题的方法,这是一个缓冲问题somedevice -getevent | grep " " --line-buffered > myrecordfile 解决了这个问题.. 也许它不是最好的主意,但现在这个 hack 完成了工作.. 谢谢为您提供所有帮助!

标签: linux bash shell ubuntu


【解决方案1】:

输出正在被缓冲,因为 C 标准库会根据 stdout 是否为终端设备来更改输出缓冲模式。如果它是一个终端设备(根据isatty(3)),那么标准输出是line-buffered:每次写入换行符时都会刷新它。如果它不是终端设备,那么它是完全缓冲的:只有在写入一定数量的数据(通常是 4 KB 到 64 KB 左右)时才会刷新它。

因此,当您使用 shell 的 > 重定向运算符将命令的输出重定向到文件时,它不再输出到终端并缓冲其输出。程序可以通过setvbuf(3) 和朋友来改变它的缓冲模式,但是程序必须配合才能做到这一点。许多程序都有命令行选项来使它们行缓冲,例如grep(1)--line-buffered 选项。看看你的命令是否有类似的选项。

如果您没有这样的选项,您可以尝试使用诸如 unbuffer(1) 之类的工具来取消缓冲输出流,但它并不总是有效并且不是标准实用程序,因此它并不总是可用.

【讨论】:

    【解决方案2】:

    命令somedevice 可能使用“标准输入/输出库”,并且在该库中,默认情况下缓冲是打开的。当输出到终端/控制台时它被关闭。

    你能修改somedevice程序吗?如果没有,你仍然可以破解它。详情请见http://www.pixelbeat.org/programming/stdio_buffering/

    【讨论】:

      【解决方案3】:

      你可以试试'tee':

      somedevice -getevent | tee -a my_record_file
      

      '-a' 选项是追加而不是仅仅替换内容。

      【讨论】:

        【解决方案4】:

        这可能是因为您的“somedevice -getevent”命令的标准输出正在被块缓冲。根据this,如果 stdout 是终端,则 stdout 默认为行缓冲(即您想要的),否则为块缓冲。

        我会查看您的 somedevice 命令的手册,看看您是否可以强制输出为无缓冲或行缓冲。如果没有,stdbuf -oL somedevice -getevent > my_record_file 应该做你想做的。

        【讨论】:

          猜你喜欢
          • 2018-05-25
          • 2019-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          相关资源
          最近更新 更多