Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Killing a subprocess including its children from python [duplicate]

Tags:

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 process for java, 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 java to run inside a shell environment, is also out of the question, due to other reasons.

How can I kill the shell and any other processes generated by it?

like image 330
afroulas Avatar asked Apr 14 '10 15:04

afroulas


1 Answers

To handle the general problem:

p=subprocess.Popen(your_command, preexec_fn=os.setsid) os.killpg(os.getpgid(p.pid), signal.SIGTERM) 

setsid will run the program in a new session, thus assigning a new process group to it and its children. calling os.killpg on it thus won't bring down your own python process also.

like image 77
berdario Avatar answered Dec 06 '22 19:12

berdario