如何在仍在写入的同时连续读取 pcap 文件?

How to continuously read pcap file while it is also still being written?

我需要连续读取由pcap捕获程序记录的pcap文件。

tcpdump -i eth0 -w foo.pcap
tcpstat -r foo.pcap -o "pps: %p\n" 1

例如,假设我正在通过上面的 tcpdump 命令记录 pcap 并尝试使用 tcpstat 读取。此处,tcpstat 正在执行当前 foo.pcap 并完成其工作。我想要的是让它等待新包并处理它们。你可以认为它是一个 tailf 命令,但它读取的是 pcap 而不是文本文件。

注意这里的tcpdump和tcpstat只是reader和writer进程的2个例子。它们可以是任何其他程序。另请注意,reader 进程可以不止一个。实现该目标的最佳方法是什么?

忽略 pcap 内容(见 post 结尾)开始,并回答一般问题:

... here tcpdump and tcpstat only 2 example of reader and writer processes. They can be any other programs. Also note that reader processes can be more than one. What is the best way to accomplish that?

所以一个作者有多个 reader 问题。

Bash 中的最佳解决方案是什么?可能 tail -F my.log 文件。示例:

while true; do echo ${RANDOM} >> my.log; sleep 1; done & 
tail -F my.log &
tail -F my.log &
tail -F my.log &

还有 tee 但它写入多个文件而不是多个进程。我想您可以设置一堆管道来处理并使用 tee。

请注意,如果您想要更高质量的解决方案,Bash 中有很多更好的解决方案 而不是 ,您可能想要使用这些解决方案。 tail 和 UNIX 管道的一个普遍问题是它们是面向流的,而您可能需要面向消息的流。 UNIX 消息 queues、queue 服务器或套接字可能对此有所帮助。


关于 pcap 案例

tail -F 将不起作用,因为 pcap file format 有一个 header 并且您不能像 tail -F 那样从文件末尾开始读取。您需要从头到尾阅读整个文件,然后开始拖尾。 -n tail 的选项是这样的:

 tail -n+0 -F foo.pcap  | tcpstat -r- -o "pps: %p\n"

tcpstat 可以从标准输入读取数据: -r 文件名 从文件名中读取所有数据,文件名可以是常规文件、命名管道或“-”以从标准输入读取数据。 所以:

tcpdump -i eth0 -w foo.pcap &
tail -f foo.pcap | tcpstat -r - -o "pps: %p\n" 1

此外,您会 运行 在不同的终端中执行此命令 windows