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

huangapple go评论74阅读模式
英文:

Go with tcpdump as external command: how to close external command properly?

问题

我有一个用于在 macOS 上使用 tcpdump(外部命令)捕获网络流量的 Go 函数:

func start_tcpdump() {
    // 使用参数运行 tcpdump
    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 文件的过程。

如何解决这个问题,以便"正确"关闭 tcpdump 外部进程?

英文:

I have a Go function to capture network traffic with <b>tcpdumb</b> (external command) on macOS:

func start_tcpdump() {
    // Run tcpdump with parameters
    cmd := exec.Command(&quot;tcpdump&quot;, &quot;-I&quot;, &quot;-i&quot;, &quot;en1&quot;, &quot;-w&quot;, &quot;capture.pcap&quot;)
    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()
}

When this function complete work, I'm trying to open output .pcap file in Wireshark and getting this error:
"<b>The capture file appears to have been cut short in the middle of a packet.</b>"<br>
Probably, <i>cmd.Process.Kill()</i> interrupts correct closing of .pcap-file.

What solution could be applied for "proper" closing of tcpdumb external process?

答案1

得分: 3

你应该使用cmd.Process.signal(os.Interrupt)来发送信号给tcpdump退出,Kill()内部调用的是signal(Kill),相当于使用kill -9强制进程退出。

英文:

You should use cmd.Process.signal(os.Interrupt) to signal tcpdump to exit, Kill() internally calls signal(Kill) which is equivalent to kill -9 to force the process to exit.

huangapple
  • 本文由 发表于 2017年1月27日 07:45:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/41884998.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定