From: Daniel Henrique Barboza <danielhb(a)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(a)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