1*4882a593SmuzhiyunFrom 5d5436dfa3bdde7b4e87ce5a40cbc724199847d6 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Hongxu Jia <hongxu.jia@windriver.com> 3*4882a593SmuzhiyunDate: Mon, 8 May 2017 16:18:02 +0800 4*4882a593SmuzhiyunSubject: [PATCH 03/11] support infinit timeout 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunUpstream-Status: Pending 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunSigned-off-by: Hongxu Jia <hongxu.jia@windriver.com> 9*4882a593Smuzhiyun--- 10*4882a593Smuzhiyun blivet/util.py | 12 ++++++++---- 11*4882a593Smuzhiyun 1 file changed, 8 insertions(+), 4 deletions(-) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundiff --git a/blivet/util.py b/blivet/util.py 14*4882a593Smuzhiyunindex 4f05076..7e89949 100644 15*4882a593Smuzhiyun--- a/blivet/util.py 16*4882a593Smuzhiyun+++ b/blivet/util.py 17*4882a593Smuzhiyun@@ -158,6 +158,7 @@ class Path(str): 18*4882a593Smuzhiyun def __hash__(self): 19*4882a593Smuzhiyun return self._path.__hash__() 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun+# timeout = -1 means infinite timeout, always wait. 22*4882a593Smuzhiyun def timeout_command(argv, timeout, *args, **kwargs): 23*4882a593Smuzhiyun """call shell-command and either return its output or kill it 24*4882a593Smuzhiyun if it doesn't normally exit within timeout seconds and return None""" 25*4882a593Smuzhiyun@@ -169,7 +170,7 @@ def timeout_command(argv, timeout, *args, **kwargs): 26*4882a593Smuzhiyun while proc.poll() is None: 27*4882a593Smuzhiyun time.sleep(0.1) 28*4882a593Smuzhiyun now = datetime.datetime.now() 29*4882a593Smuzhiyun- if (now - start).seconds> timeout: 30*4882a593Smuzhiyun+ if timeout != -1 and (now - start).seconds> timeout: 31*4882a593Smuzhiyun os.kill(proc.pid, signal.SIGKILL) 32*4882a593Smuzhiyun os.waitpid(-1, os.WNOHANG) 33*4882a593Smuzhiyun program_log.debug("%d seconds timeout" % timeout) 34*4882a593Smuzhiyun@@ -183,7 +184,7 @@ def timeout_command(argv, timeout, *args, **kwargs): 35*4882a593Smuzhiyun program_log.debug("Return code: %d", proc.returncode) 36*4882a593Smuzhiyun return (proc.returncode, proc.stdout.read()) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun-def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=False, binary_output=False): 39*4882a593Smuzhiyun+def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=False, binary_output=False, timeout=10): 40*4882a593Smuzhiyun if env_prune is None: 41*4882a593Smuzhiyun env_prune = [] 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun@@ -192,7 +193,10 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa 44*4882a593Smuzhiyun os.chroot(root) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun with program_log_lock: # pylint: disable=not-context-manager 47*4882a593Smuzhiyun- program_log.info("Running... %s", " ".join(argv)) 48*4882a593Smuzhiyun+ if timeout != -1: 49*4882a593Smuzhiyun+ program_log.info("Running... %s", " ".join(argv)) 50*4882a593Smuzhiyun+ else: 51*4882a593Smuzhiyun+ program_log.info("Running... %s ...infinite timeout", " ".join(argv)) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun env = os.environ.copy() 54*4882a593Smuzhiyun env.update({"LC_ALL": "C", 55*4882a593Smuzhiyun@@ -205,7 +209,7 @@ def _run_program(argv, root='/', stdin=None, env_prune=None, stderr_to_stdout=Fa 56*4882a593Smuzhiyun else: 57*4882a593Smuzhiyun stderr_dir = subprocess.PIPE 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun- res, out = timeout_command(argv, 10, 60*4882a593Smuzhiyun+ res, out = timeout_command(argv, timeout, 61*4882a593Smuzhiyun stdin=stdin, 62*4882a593Smuzhiyun stdout=subprocess.PIPE, 63*4882a593Smuzhiyun stderr=stderr_dir, 64*4882a593Smuzhiyun-- 65*4882a593Smuzhiyun2.7.4 66*4882a593Smuzhiyun 67