【问题标题】:Go with tcpdump as external command: how to close external command properly?使用 tcpdump 作为外部命令:如何正确关闭外部命令?
【发布时间】:2017-01-26 23:45:02
【问题描述】:

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

【问题讨论】:

  • tcpdump 表示它通过 SIGINT 或 SIGTERM 正常退出。也许阅读 stdout 和 stderr 以查看是否有任何相关消息。

标签: go


【解决方案1】:

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

【讨论】:

  • 啊,是的,默认的 posix kill 信号是 TERM,但这里的 kill 真的是 SIGKILL。
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 2014-12-23
  • 1970-01-01
  • 2015-05-15
  • 2013-10-06
  • 2012-12-28
  • 1970-01-01
  • 2013-04-16
相关资源
最近更新 更多