2012-03-17 82 views
4

,所以我在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 

而这只是继续运行,只要它有任何原因它输出的东西。所以没有执行的结束。

没有回声工作完美,但是当我试图使用'>'运算符这似乎不写入文件。

所以例如

#somedevice -getevent > my_record_file 

这不能正常工作,my_record_file只得到在间隔写入数据,但是我想立即写入。

任何想法?

+0

滞后可能是由于输出缓冲。你可以改变程序在每次打印后做一次flush()或者在其标准输出上设置自动刷新吗? – 2012-03-17 18:04:26

+0

好的,我想出了一个解决方案,这是一个缓冲问题'somedevice -getevent | grep“”--line-buffered> myrecordfile'解决了这个问题..也许它不是最好的主意,但现在这个黑客做了这份工作..谢谢你的帮助! – mur 2012-03-17 18:33:46

回答

5

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

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

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

0

你可以试试“三通”:

somedevice -getevent | tee -a my_record_file 

的“-a”选项是追加,而不是仅仅更换内容。

+0

我不确定这会有什么区别... – 2012-03-17 18:19:54

2

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

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

+0

该理论是非常翔实的...帮助我找出主要问题!日Thnx! – mur 2012-03-17 18:34:20

0

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

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

+1

在接近它这种方式我得到这个错误'错误:ld.so:对象'/usr/lib/coreutils/libstdbuf.so'从LD_PRELOAD不能被预加载:ignored.' - 尽管如此感谢您的帮助队友..我想解决这个问题,通过评论发布了一个解决我的问题 – mur 2012-03-17 18:31:27