![](/img/trans.png)
[英]Python with tcpdump in a subprocess: how to close subprocess properly?
[英]Python - tcpdump subprocess hangs
可能是关于subprocesses
的简单修复,但是我无法弄清楚出了什么问题。
我有一小段要捕获数据包的网页。 我想要每个网页一个pcap
文件。 我正在使用tcpdump
和phantomJS
。 这是代码的相关部分:
from selenium import webdriver
..more imports here..
URLs = ['https://webpage1.com', 'https://webpage2.com', etc.]
driver = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs', port=65000)
driver.set_window_size(1024, 768)
def Crawler():
for eachHost in URLs:
print '\n* Capturing in-progress.'
print '* Host: ', eachHost
try:
handle = subprocess.Popen(['sudo', 'tcpdump', '-w', str(eachHost) + '.pcap'], stdout=subprocess.PIPE)
driver.get(eachHost)
time.sleep(5)
driver.close()
time.sleep(2)
handle.terminate()
print '* tcpdump killed.'
except:
print '* Exception caught.'
sys.exit(0)
sys.exit(0)
我期望它做的是 :捕获每个页面加载的前5秒,并放入单独的pcaps
它的作用 :在我的终端中打印以下内容,然后挂起,捕获但不终止,并且不循环到下一个网页。
Host: https://www.webpage1.com/
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
我认为您无法终止子进程的原因是因为您正在使用sudo
命令启动该进程。 由于tcpdump然后以root用户身份运行,因此您不能仅以常规用户身份终止它。
我只是尝试在本地测试。 启动tcpdump之后:
$ ps ax | grep tcpdump
62410 s007 S+ 0:00.01 sudo tcpdump
62420 s007 S+ 0:00.05 tcpdump
62540 s008 S+ 0:00.00 grep tcpdump
$ kill -15 62410
-bash: kill: (62410) - Operation not permitted
$ kill -15 62420
-bash: kill: (62420) - Operation not permitted
我不知道在不派生另一个进程的情况下执行sudo kill / terminate命令的方法(例如,通过subprocess
),所以我将不得不使用handle.pid
获取tcpdump进程ID( pid
)并调用handle.pid
subprocess.Popen(['sudo', 'kill', '15', <pid>])
。
我认为您的子流程调用阻塞了您无法停止它的原因。 尝试使用multiprocessing
然后将tcpdump命令放入线程中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.