Python在子进程中使用tcpdump:如何正确关闭子进程?

时间:2016-10-19 19:29:07

标签: python python-2.7 subprocess tcpdump

我有一个Python脚本,可以在子进程中使用tcpdumb捕获网络流量:

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

当这个脚本完成工作时,我试图在Wireshark中打开输出.pcap文件并得到错误:
"捕获文件似乎是在包裹中间缩短。"

什么样的解决方案适用于"适当的"关闭tcpdumb子进程?

3 个答案:

答案 0 :(得分:3)

而不是p.kill(),您可以使用p.send_signal(subprocess.signal.SIGTERM)发送终止信号而不是kill(p.terminate()执行相同的操作)

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

答案 1 :(得分:2)

找到工作解决方案:
我已将p.kill()更改为p.terminate() 在这个改变之后,子过程是'#34;正确"已完成(tcpdump子进程的输出,控制台中有统计信息),输出.pcap文件未损坏。

答案 2 :(得分:0)

关于关闭子进程我遇到了同样的问题。这个帖子确实有帮助,所以谢谢,尤其是https://stackoverflow.com/users/3583715/rkh。我的解决方案:

在:

output = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
message = output.stdout.read()
output.stdout.close()

阅读了Popen文档:

output = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
message = output.stdout.read()
output.TerminateProcess()

出于某种原因,调用output.kill()和/或output.terminate()或发送output.send_signal(subprocess.signal.SIGTERM)不起作用,但output.TerminateProcess()没有。