我有一个Python脚本,可以在子进程中使用tcpdumb捕获网络流量:
p = subprocess.Popen(['tcpdump', '-I', '-i', 'en1',
'-w', 'cap.pcap'], stdout=subprocess.PIPE)
time.sleep(10)
p.kill()
当这个脚本完成工作时,我试图在Wireshark中打开输出.pcap文件并得到错误:
"捕获文件似乎是在包裹中间缩短。"
什么样的解决方案适用于"适当的"关闭tcpdumb子进程?
答案 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()没有。