我在旋转文件时遇到了一些问题。情况如下:
- 一个像 wireshark 或 vlc 这样的程序将所有数据转储到一个文件中,比如 netstream.bin
- 如果我将 netstream.bin 转换为 netstream.bin.rotate 程序仍会写入 netstream.bin.rotate 。
- 因为是流转储,这个文件会越来越大
有什么解决方案吗?如何旋转这些文件?
类似于 FILO 伪文件:
mkfilo /tmp/stream.buffer
./scrtip/program.bin -o /tmp/stream.buffer
get_out_filo(stream.buffer) > netstream.bin
我的问题听起来也像“如何更改程序文件描述符来写入另一个文件”
答案1
FIFO 可能对你来说不太适用。必须成为另一侧的读者,否则写者将阻塞。此外,一旦读者不再读取 fifo,写者将因管道损坏而退出。
logrotate
可以在很大程度上帮助您,但可能会丢失一些数据。
- 以追加模式追加到给定的文件(大多数日志系统都会这样做)。
- 在写入数据时,将整个文件逐字复制为新名称。
- 将原始文件截断为零,并将其保留在原处。
丢失数据的问题发生在步骤 2 和步骤 3 之间。在文件复制已复制其认为是文件末尾的内容后,可能会有更多数据写入文件。当步骤 3 发生时,您会截断(并丢失)复制过程中遗漏的数据。
根据你的需求程度,另一种方法是编写一个程序,该程序始终从 fifo 文件中读取数据,但根据某些条件(例如,它接收到信号)将数据写入不同位置。这是一种简洁的方法,但你需要先编写该程序!