我想持续监控来自特定来源的 TCP 数据。
我在 Windows 服务器上的 cygwin mintty xterm 中使用此命令。
tshark.exe -i 5 -f "tcp port 1234" -T fields -e data | xxd -r -p
这非常有效,因为我得到了一个 ASCII 滚动窗口,这是发送给我的数据。当连接失败时(这就是我正在尝试调试的),最后发送的数据将显示在 cygwin 窗口中。
但是,我注意到 Tshark 内存使用量不断攀升,几个小时后就相当大了。
对此我能做什么?我想让它运行几天。
tshark
命令行选项以包含 -b files:N
选项(可能还有其他 -b
选项以及 duration 和/或 filesize)来启动环形缓冲区。这样做将导致 tshark
在滚动到环形缓冲区中的下一个文件时丢弃其内部状态。丢弃状态意味着释放与该状态信息相关的所有内存,因此至少在理论上,您可以永远捕获。
如需了解更多信息,请随时阅读 Wireshark 博客文章 “To Infinity and Beyond! Capturing Forever with Tshark”,作者 Evan Huus,他是 Wireshark 核心开发人员之一,也是负责实现此功能以丢弃状态的人员信息。
我遇到了类似的问题,但我没有捕获到文件中,而是读取已经从大文件(75GB)中捕获的数据包。因此,看起来 tshark 有一些内部簿记表,该表随着许多包而增长。对我来说,解决方案是会话重置选项(-M),它看起来会截断内部状态:
tshark -r /tmp/traffic.pcap -M 100000
我也不用
-w
记录数据包(但它自己会记录数据包,带有 .pcapng
扩展名的文件会在 /tmp/
中疯狂增长)
我解决了这两个问题:
.. 通过添加
-a duration:3600
+ 自动重启运行我的 tshark
的 systemd 服务。因此,一小时后 tshark
会自行停止,/tmp/
中的内存和文件将被释放,并且 tshark
会由 Systemd 重新启动。