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

2024-05-19 11:04:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python脚本,用tcpdumpsubprocess中捕获网络流量:

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

当这个脚本完成它的工作时,我试图在Wireshark中打开output.pcap文件,得到一个错误:

"The capture file appears to have been cut short in the middle of a packet."

对于tcpdumpsubprocess的“正确”关闭,可以采用什么解决方案?在


Tags: 脚本outputtimestdoutpcapsleeptcpdumpcap
3条回答

找到工作溶液:
我已将p.kill()改为p.terminate()
在此更改之后,subprocess被“正确”完成(输出tcpdump子进程,统计信息在控制台中可用),并且输出.pcap文件没有损坏。在

关于关闭subprocesses,我也有同样的问题。这个帖子真的很有帮助,所以谢谢你,尤其是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文档之后:

^{pr2}$

由于某些原因,调用output.kill(),和/或output.terminate()或发送{}都不起作用,但是output.TerminateProcess()起作用了。在

代替p.kill(),可以使用p.send_signal(subprocess.signal.SIGTERM)发送终止信号,而不是kill(p.terminate()也这样做)。在

Popen docs描述了send_signal()命令。关于信号的文档有点弱,但是(子流程信号)将列出您可能发送到进程的所有信号,但终止应该允许它有一些时间进行清理。在

相关问题 更多 >

    热门问题