用于旋转流的 Linux 伪文件

用于旋转流的 Linux 伪文件

我在旋转文件时遇到了一些问题。情况如下:

  1. 一个像 wireshark 或 vlc 这样的程序将所有数据转储到一个文件中,比如 netstream.bin
  2. 如果我将 netstream.bin 转换为 netstream.bin.rotate 程序仍会写入 netstream.bin.rotate 。
  3. 因为是流转储,这个文件会越来越大

有什么解决方案吗?如何旋转这些文件?

类似于 FILO 伪文件:

mkfilo /tmp/stream.buffer
./scrtip/program.bin -o /tmp/stream.buffer
get_out_filo(stream.buffer) > netstream.bin

我的问题听起来也像“如何更改程序文件描述符来写入另一个文件”

答案1

FIFO 可能对你来说不太适用。必须成为另一侧的读者,否则写者将阻塞。此外,一旦读者不再读取 fifo,写者将因管道损坏而退出。

logrotate可以在很大程度上帮助您,但可能会丢失一些数据。

  1. 以追加模式追加到给定的文件(大多数日志系统都会这样做)。
  2. 在写入数据时,将整个文件逐字复制为新名称。
  3. 将原始文件截断为零,并将其保留在原处。

丢失数据的问题发生在步骤 2 和步骤 3 之间。在文件复制已复制其认为是文件末尾的内容后,可能会有更多数据写入文件。当步骤 3 发生时,您会截断(并丢失)复制过程中遗漏的数据。

根据你的需求程度,另一种方法是编写一个程序,该程序始终从 fifo 文件中读取数据,但根据某些条件(例如,它接收到信号)将数据写入不同位置。这是一种简洁的方法,但你需要先编写该程序!

相关内容