簡體   English   中英

Python在子進程中使用tcpdump:如何正確關閉子進程?

[英]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文件並收到此錯誤:

“捕獲文件似乎在數據包中間縮短了。”

什么解決方案可以應用於“正確”關閉tcpdumpsubprocess

取而代之的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM