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

Go 使用tcpdump作为外部命令:如何正确关闭外部命令?,go,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) } ti

我有一个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中打开output.pcap文件,并出现以下错误: “捕获文件似乎在一个数据包的中间被剪短了。” 可能,cmd.Process.Kill()会中断.pcap文件的正确关闭


“正确”关闭tcpdumb外部进程可以采用什么解决方案?

您应该使用
cmd.process.signal(os.Interrupt)
发出信号,让tcpdump退出,
Kill()
内部调用
signal(Kill)
相当于
kill-9
来强制进程退出。

tcpdump说它通常通过SIGINT或SIGTERM退出。也许阅读stdout和stderr,看看是否有任何相关的消息。啊,是的,默认的posix kill信号是TERM,但这里的kill实际上是SIGKILL。