Go 使用tcpdump作为外部命令:如何正确关闭外部命令?
我有一个Go功能,可以通过macOS上的tcpdumb(外部命令)捕获网络流量: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
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。