Cal*_*lum 6 python subprocess selenium-grid
我一直有一个问题,我可以杀死产生节点的进程,但节点不会被杀死.有没有人有任何建议如何做到这一点?
我最近尝试完成的一些失败尝试是:
node.terminate()
Run Code Online (Sandbox Code Playgroud)
和
node.send_signal(signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)
以下是代码:
from subprocess import Popen
import json
import sys
import os
import signal
import requests
FNULL = open(os.devnull, 'w')
json_data = open('nodes.json', 'r').read()
data = json.loads(json_data)
port = data['port']
# launch hub
hub = Popen('java -jar selenium-server-standalone-2.37.0.jar -role hub -port %s' % port, stdout=FNULL, stderr=FNULL, shell=True)
#launch nodes
nodes = []
for node in data['nodes']:
options = ''
if node['name'] == 'CHROME':
options += '-Dwebdriver.chrome.driver=../grid/chromedriver '
#options += ' -browser browserName='+node['name']+' maxInstances='+str(node['maxInstances'])
nodes.append(Popen('java -jar selenium-server-standalone-2.37.0.jar -role node -hub http://localhost:%i/grid/register %s' % (port, options), stdout=FNULL, stderr=FNULL, shell=True))
# wait for user input
print "type 'q' and ENTER to close the grid:"
while True:
line = sys.stdin.readline()
if line == 'q\n':
break
# close nodes
for node in nodes:
#node.terminate()
node.send_signal(signal.SIGINT)
# close hub
r = requests.get('http://localhost:'+str(port)+'/lifecycle-manager?action=shutdown')
Run Code Online (Sandbox Code Playgroud)
我知道,我基本上被迫使用shell = True,以获得重定向工作处理父python进程中的子进程stdout/stderr不是一个选项,因为我找不到在非等待方式(父子进程必须在子进程运行时执行其他操作)
# close nodes
for node in nodes:
node.send_signal(signal.SIGINT)
node.terminate()
Run Code Online (Sandbox Code Playgroud)
这似乎会杀死除1个节点之外的所有进程.并不总是相同的
你可以尝试使用os.killpg. 此函数将信号发送到进程组,如果您的进程不更改进程组,它应该可以工作。
import os
import signal
os.killpg(os.getpgid(pid), signal.SIGINT)
Run Code Online (Sandbox Code Playgroud)
请注意,如果您在 shell(bash、zsh 等)下创建进程,则进程组将会更改,在这种情况下,应使用更复杂的技术。
| 归档时间: |
|
| 查看次数: |
2397 次 |
| 最近记录: |