Rework subprocess utility function
authorJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Wed, 15 Nov 2017 18:47:54 +0000 (13:47 -0500)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Wed, 15 Nov 2017 18:47:54 +0000 (13:47 -0500)
Add a wait function with a possible timeout.

The terminate function will perform an aggressive kill if the timeout is
reached.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
lttng_ivc/utils/runtime.py

index 9efdabee085b0bc7d4c33ec5160209002eddef93..a25d0bb97fbc77d711e43439fd7039bc1664baed 100644 (file)
@@ -73,13 +73,20 @@ class Runtime(object):
     def subprocess_signal(self, subprocess_uuid, signal):
         self.__subproces[subprocess_uuid].send_signal(signal)
 
-    def subprocess_terminate(self, subprocess_uuid, timeout=60):
+    def subprocess_terminate(self, subprocess_uuid, timeout=60, check_return=True):
         process = self.__subprocess[subprocess_uuid]
         process.terminate()
-        process.wait(timeout)
+        try:
+            process.wait(timeout)
+        except subprocess.TimeoutExpired:
+            # Force kill
+            return self.subprocess_kill(process)
         stdout, stderr = self.__stdout_stderr[subprocess_uuid]
         stdout.close()
         stderr.close()
+        if check_return:
+            if process.returncode != 0:
+                raise subprocess.CalledProcessError(process.returncode, process.args)
         return process
 
     def subprocess_kill(self, subprocess_uuid):
@@ -91,6 +98,17 @@ class Runtime(object):
         stderr.close()
         return process
 
+    def subprocess_wait(self, subprocess_uuid, check_return=True):
+        process = self.__subprocess[subprocess_uuid]
+        process.wait()
+        stdout, stderr = self.__stdout_stderr[subprocess_uuid]
+        stdout.close()
+        stderr.close()
+        if check_return:
+            if process.returncode != 0:
+                raise subprocess.CalledProcessError(process.returncode, process.args)
+        return process
+
     def get_subprocess_stdout_path(self, subprocess_uuid):
         stdout, stderr = self.__stdout_stderr[subprocess_uuid]
         return stdout.name
This page took 0.024801 seconds and 5 git commands to generate.