If the command launched by tesh executes some subprocesses
(which are not cleaned by the root process on SIGKILL)
the previous code let such subprocesses in a running state.
Now the root process is launched into a new session (man setsid)
and the whole session is killed by tesh. All subprocess should be killed
as long as the session is not changed in the process tree.
Traversing the process tree could also be done, but it may require
additional dependencies (i.e., psutil).
- proc = subprocess.Popen(args, bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
+ proc = subprocess.Popen(args, bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True, preexec_fn=os.setsid)
except FileNotFoundError:
print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': File not found")
tesh_exit(3)
except FileNotFoundError:
print("["+FileReader().filename+":"+str(self.linenumber)+"] Cannot start '"+args[0]+"': File not found")
tesh_exit(3)
(stdout_data, stderr_data) = proc.communicate("\n".join(self.input_pipe), self.timeout)
except subprocess.TimeoutExpired:
print("Test suite `"+FileReader().filename+"': NOK (<"+cmdName+"> timeout after "+str(self.timeout)+" sec)")
(stdout_data, stderr_data) = proc.communicate("\n".join(self.input_pipe), self.timeout)
except subprocess.TimeoutExpired:
print("Test suite `"+FileReader().filename+"': NOK (<"+cmdName+"> timeout after "+str(self.timeout)+" sec)")
+ os.killpg(os.getpgid(proc.pid), signal.SIGKILL)
tesh_exit(3)
if self.output_display:
tesh_exit(3)
if self.output_display: