From da0b3c5ad5bfbbcb5b6b5fdf43a66ed2ae7ccfb2 Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Wed, 15 Nov 2017 13:47:54 -0500 Subject: [PATCH] Rework subprocess utility function 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 --- lttng_ivc/utils/runtime.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lttng_ivc/utils/runtime.py b/lttng_ivc/utils/runtime.py index 9efdabe..a25d0bb 100644 --- a/lttng_ivc/utils/runtime.py +++ b/lttng_ivc/utils/runtime.py @@ -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 -- 2.34.1