Killing a subprocess including its children from python
        Posted  
        
            by user316664
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by user316664
        
        
        
        Published on 2010-04-14T15:51:41Z
        Indexed on 
            2010/04/14
            15:53 UTC
        
        
        Read the original article
        Hit count: 226
        
Hi, I'm using the subprocess module on python 2.5 to spawn a java program (the selenium server, to be precise) as follows:
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)
This process is supposed to get killed once the automated tests are finished. I'm using os.kill to do this:
os.killpg(selenium_server_process.pid, signal.SIGTERM) selenium_server_process.wait()
This does not work. The reason is that the shell subprocess spawns another processfor the java program, and the pid of that process is unknown to my python code. I've tried killing the process group with os.killpg, but that kills also the python process which runs this code in the first place. Setting shell to false, thus avoiding the java program to run inside a shell environment, is also out of the question, due to other reasons.
Does anyone have an idea how I can kill the shell and any other processes generated by it?
Cheers, Ulas
© Stack Overflow or respective owner