Unterprozess einschließlich seiner untergeordneten Elemente aus Python beenden [duplizieren]

Diese Frage hat hier bereits eine Antwort:

So beenden Sie einen Python-Unterprozess, der mit shell = True @ gestartet wur 10 Antworten

Ich verwende das Unterprozessmodul unter Python 2.5, um ein Java-Programm (genauer gesagt den Selenium-Server) wie folgt zu erzeugen:

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)

Dieser Vorgang soll abgebrochen werden, sobald die automatisierten Tests abgeschlossen sind. Ich benutzeos.kill um dies zu tun

os.killpg(selenium_server_process.pid, signal.SIGTERM)
selenium_server_process.wait()

Das funktioniert nicht. Der Grund ist, dass der Shell-Unterprozess einen anderen Prozess für Java erzeugt und die PID dieses Prozesses meinem Python-Code unbekannt ist. Ich habe versucht, die Prozessgruppe mit @ zu tötos.killpg, aber das bricht auch den Python-Prozess ab, der diesen Code überhaupt erst ausführt. Das Setzen von "shell" auf "false", um zu verhindern, dass Java in einer Shell-Umgebung ausgeführt wird, kommt aus anderen Gründen ebenfalls nicht in Frage.

Wie kann ich die Shell und andere von ihr erzeugte Prozesse beenden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage