我有一个Go功能,可以在macOS上使用 tcpdumb (外部命令)捕获网络流量:
func start_tcpdump() {
// Run tcpdump with parameters
cmd := exec.Command("tcpdump", "-I", "-i", "en1", "-w", "capture.pcap")
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
timer := time.AfterFunc(3 * time.Second, func() {
cmd.Process.Kill()
})
err := cmd.Wait()
if err != nil{
log.Fatal(err)
}
timer.Stop()
}
当此函数完成后,我正在尝试在Wireshark中打开输出.pcap文件并收到此错误:
“捕获文件似乎在数据包中间缩短了。”
可能, cmd.Process.Kill()会中断正确关闭.pcap文件。
可以采用什么解决方案来“正确”关闭tcpdumb外部流程?
答案 0 :(得分:3)
您应该使用cmd.Process.signal(os.Interrupt)
通知tcpdump退出,Kill()
内部调用signal(Kill)
,这相当于kill -9
以强制进程退出。