
From: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com> The subprocess.kill() call does not handle well the created children of the process created by the Popen() call. In some cases (for example, the mount command) the parent processes creates children processes that aren't killed, leaving the parent thread hanging out in an infinite loop waiting for kill() to finish. An attempt was made using the os.killpg() call, but to no success. Using psutils facilities to kill all the children before killing the opened process was easier and clearer than the alternatives (opening a new thread and trying to kill the thread, for example). Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com> --- src/kimchi/utils.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py index a1410c0..6be1c04 100644 --- a/src/kimchi/utils.py +++ b/src/kimchi/utils.py @@ -23,6 +23,7 @@ import cherrypy import os +import psutil import re import subprocess import urllib2 @@ -137,8 +138,16 @@ def run_command(cmd, timeout=None): timeout is a float number in seconds. timeout default value is None, means command run without timeout. """ + # subprocess.kill() can leave descendants running + # and halting the execution. Using psutil to + # get all descendants from the subprocess and + # kill them recursively. def kill_proc(proc, timeout_flag): try: + parent = psutil.Process(proc.pid) + for child in parent.get_children(recursive=True): + child.kill() + # kill the process after no children is left proc.kill() except OSError: pass -- 1.8.3.1