使用tcpdump作为外部命令:如何正确关闭外部命令?

时间:2017-01-26 23:45:03

标签: go

我有一个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外部流程?

1 个答案:

答案 0 :(得分:3)

您应该使用cmd.Process.signal(os.Interrupt)通知tcpdump退出,Kill()内部调用signal(Kill),这相当于kill -9以强制进程退出。