清除管道输出而不中断程序?

时间:2013-07-26 16:31:31

标签: bash pipe

我正在运行一个程序(pianobar)管道传输到文本文件,每秒输出一次。生成的文件(“pianobarout.txt”)需要定期清除,否则会增长到很大的比例。但是,我不想阻止pianobar清除文件。

我已尝试运行> pianobarout.txt以及echo "" > pianobarout.txt,但两者都会导致系统资源严重超过30秒,导致来自pianobar的音频跳过。我尝试删除该文件,但看起来该文件在删除后没有重新创建,我只是丢失了管道。

我正在使用python工作,所以如果有任何库可以提供帮助,我可以使用它们。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

如果您目前正在使用截断方式进行重定向,例如yourprogram > file.txt,请尝试重定向并附加:yourprogram >> file.txt

输出文件被截断时,两者之间存在很大差异。

通过附加重定向,数据将写入文件的当前末尾。如果将其截断为0字节,则下一次写入将发生在位置0。

通过截断重定向,可以在文件中最后一次写入的位置写入数据。如果将其截断为0字节,则写入将继续在字节1073741824处继续关闭。

如果文件系统支持稀疏文件(ext2-4和大多数Unix fs),则会产生稀疏文件;如果文件没有,则会导致漫长的等待(如fat32)。漫长的等待也可能是由于文件后面的任何内容引起的,例如tail -f,它必须通过读取GB的零来捕获。

备选方案包括yourprogram | split -b 1G - output-,它将每个1GB写入output-aaoutput-ab等,让您可以删除旧文件。