Уничтожение подпроцесса, включая его потомков из python [дубликата]
На этот вопрос уже есть ответ:
Как завершить подпроцесс python, запущенный с shell = True 10 ответовЯ использую модуль подпроцесса в Python 2.5 для запуска Java-программы (точнее, сервера selenium) следующим образом:
import os
import subprocess
display = 0
log_file_path = "/tmp/selenium_log.txt"
selenium_port = 4455
selenium_folder_path = "/wherever/selenium/lies"
env = os.environ
env["DISPLAY"] = ":%d.0" % display
command = ["java",
"-server",
"-jar",
'selenium-server.jar',
"-port %d" % selenium_port]
log = open(log_file_path, 'a')
comm = ' '.join(command)
selenium_server_process = subprocess.Popen(comm,
cwd=selenium_folder_path,
stdout=log,
stderr=log,
env=env,
shell=True)
Предполагается, что этот процесс завершится после завершения автоматических тестов. Я используюos.kill
сделать это
os.killpg(selenium_server_process.pid, signal.SIGTERM)
selenium_server_process.wait()
Это не работает. Причина в том, что подпроцесс оболочки порождает другой процесс для Java, а pid этого процесса неизвестен моему коду Python. Я пытался убить группу процессов с помощьюos.killpg
, но это убивает также процесс python, который запускает этот код в первую очередь. Установка оболочки в false, что позволяет избежать запуска Java внутри среды оболочки, также не может быть рассмотрено по другим причинам.
Как я могу уничтожить оболочку и любые другие процессы, сгенерированные ею?