Używam moduł subprocess na Python 2.5 do tarła program Java (serwer selenu, być precyzyjny) w następujący sposób:Zabijanie podproces tym jego dzieci z pytona
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)
Proces ten ma na celu zostaną zabici po zakończeniu testów automatycznych. Używam os.kill
, aby to zrobić:
os.killpg(selenium_server_process.pid, signal.SIGTERM)
selenium_server_process.wait()
To nie działa. Powodem jest to, że podproces powłoki tworzy kolejny proces dla java, a pid tego procesu jest nieznany dla mojego kodu Pythona. Próbowałem zabić grupę procesów z os.killpg
, ale to zabija również proces python, który uruchamia ten kod w pierwszej kolejności. Ustawienie powłoki na wartość false, co pozwala uniknąć uruchamiania java w środowisku powłoki, również nie wchodzi w grę z innych powodów.
Jak mogę zabić powłokę i inne procesy przez nią wygenerowane?
To tylko wersja unix, prawda? – Macke
related: [Jak zakończyć podprocesor Pythona uruchamiany z powłoką = True] (http://stackoverflow.com/q/4789837/4279) – jfs