子进程中带有tcpdump的Python:如何正确关闭子进程?

olp*_*phy 5 python subprocess tcpdump python-2.7

我有一个Python脚本来捕获网络流量与tcpdumpsubprocess

p = subprocess.Popen(['tcpdump', '-I', '-i', 'en1',
                  '-w', 'cap.pcap'], stdout=subprocess.PIPE)
time.sleep(10)
p.kill()
Run Code Online (Sandbox Code Playgroud)

当此脚本完成工作时,我正在尝试.pcap在Wireshark中打开输出文件并得到以下错误:

“捕获文件似乎在数据包中间被剪切了。”

有什么解决方案可以适用于“正确”收盘tcpdumpsubprocess

rkh*_*rkh 6

代替p.kill(),您可以使用p.send_signal(subprocess.signal.SIGTERM)发送终止信号而不是杀死信号(p.terminate()同样如此)。

POPEN文档描述的send_signal()命令。关于信号的文档有点薄弱,但是 dir(subprocess.signal) 将列出您可能发送给进程的所有信号,但终止应该允许它一些时间来清理。