[英]Python with tcpdump in a subprocess: how to close subprocess properly?
我有一個Python腳本,用於在subprocess
tcpdump
中使用tcpdump
捕獲網絡流量:
p = subprocess.Popen(['tcpdump', '-I', '-i', 'en1',
'-w', 'cap.pcap'], stdout=subprocess.PIPE)
time.sleep(10)
p.kill()
當此腳本完成其工作時,我正在嘗試在Wireshark中打開輸出.pcap
文件並收到此錯誤:
“捕獲文件似乎在數據包中間縮短了。”
什么解決方案可以應用於“正確”關閉tcpdump
的subprocess
?
取而代之的p.kill()
您可以使用p.send_signal(subprocess.signal.SIGTERM)
發送終止信號,而不是殺死( p.terminate()
做同樣的)。
Popen文檔描述了send_signal()
命令。 關於信號的文檔有點弱,但是dir(subprocess.signal)將列出您可能發送給進程的所有信號,但是終止應該允許它有一些時間來清理。
找到工作方案:
我已將p.kill()
更改為p.terminate()
。
在此更改之后, subprocess
.pcap
“正確”完成( tcpdump
子.pcap
輸出,控制台中提供統計信息)並且輸出.pcap
文件未損壞。
我在關閉subprocess
遇到了同樣的問題。 這個帖子確實很有幫助,所以非常感謝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()
沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.