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 AntwortenIch 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?