tcpdump正在运行的时候,他写入的pcap可能是不完整的,通常我们要结束掉tcpdump才能拿到完整的pcap,否则wireshark打开的时候会提示:The capture file appears to have been cut short in the middle of a packet。这可能是因为tcpdump有缓存机制,没有实时将每一个抓到的报文立即写入到磁盘
那么如何在不结束tcpdump的情况下拿到完整的pcap文件呢?如果有一种机制可以通知tcpdump立即写入挂起的报文就好了。尝试过sync不行,因为sync只能导出文件系统缓存。tcpdump可能有自己的缓存机制。
查询tcpdump源代码,果然发现了相关的代码,如下:
#if defined(HAVE_PCAP_DUMP_FLUSH) && defined(SIGUSR2)
#define SIGNAL_FLUSH_PCAP SIGUSR2
#endif
#ifdef SIGNAL_FLUSH_PCAP
(void)setsignal(SIGNAL_FLUSH_PCAP, flushpcap);
#endif
#ifdef SIGNAL_FLUSH_PCAP
static void
flushpcap(int signo _U_)
{
if (pdd != NULL)
pcap_dump_flush(pdd);
}
看起来这个功能是可选的,需要编译时配置,搜索 SIGNAL_FLUSH_PCAP 的定义找到 HAVE_PCAP_DUMP_FLUSH,也就是说只有配置了 HAVE_PCAP_DUMP_FLUSH 才能启用这个功能。如果已经启用了这个功能,只需要使用kill发送信号给他,触发 flushpcap 即可
kill -SIGUSR2 [tcpdump_pid]