【问题标题】:Getting the package statistic info from a tcpdump subprocess after terminating it终止后从 tcpdump 子进程获取包统计信息
【发布时间】:2017-08-07 21:54:45
【问题描述】:

我正在使用subprocess.Popen 执行tcpdump,它可以在我的代码中正确收集包信息。
之后,我想通过另一个线程使用os.kill(pid, signal.SIGKILL) 杀死 tcpdump,然后记录相关的数据包统计信息。

一般来说,我想在 bash 中运行 tcpdump 时获取统计信息:

  • 捕获的数据包
  • 过滤器收到的数据包
  • 内核丢弃的数据包

我尝试了以下格式的cmd:

proc=subprocess.Popen(shlex.split(tcpdump_cmd), 
                      stdouot=subprocess.PIPE, 
                      stderr=subprocess.PIPE)

但是,在通过proc.stdout/stderr.readline() 杀死proc.pid 后,我未能获得统计数据。
我也试过用:

fcntl.fcntl(fd.fileno().fcntl.F_SETFL,
            (fcntl.fcntl(fd.fileno.F_GETFL) | os.O_NDELAY | os.O_NONBLOCK))

他们都不能像我预期的那样输出统计数据。 此外,我尝试了shell=Trueshell=false - 结果相同。

有什么方法可以实现吗? 谢谢!

附:我发现有一些与 tcpdump 相关的主题,不幸的是,据我所知,我没有发现他们可以帮助我解决这个问题。

【问题讨论】:

标签: python subprocess tcpdump


【解决方案1】:

你是如何杀死进程的?

如果这是一个 UN*X,那么:

  • 如果您使用 SIGKILL 杀死它,则会立即终止 tcpdump 并且没有机会打印统计信息,因此将没有统计信息可供读取;
  • 如果您使用 SIGTERM 或 SIGINT 杀死它,则会向它发送一个它捕获的信号,因此它会在终止之前打印统计信息。

如果这是 Windows(因此您使用的是 WinDump),您可能无法终止它以使其有机会打印统计信息。

【讨论】:

  • 非常感谢您的提醒,Guy Harris,我使用 SIGKILL 来杀死它,我已将其更改为 SIGTERM :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
相关资源
最近更新 更多