summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-04-05 19:47:40 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-04-05 20:12:12 +0200
commit3a479c212dfdd51c9cb031a9a09138d24ab1ca97 (patch)
treeb66987a20c51633fe2ef6328000b5091af19da48 /src
parenta353457fd208ae1be449f0f067c3b1c0dd1132ec (diff)
processes: Fix kill of processes run under sudo
sudo drops forwarding of signals sent by processes of the same process group, which means by default will drop signals from parent and children processes. By moving it to another group, we will later be able to kill it. Note: sudo documentation is wrong, since it states it only drops signals from children. See following link for more information: https://stackoverflow.com/questions/34337840/cant-terminate-a-sudo-process-created-with-python-in-ubuntu-15-10 Change-Id: I25990234aaa496c501ff45ad7f7fd549d6f188da
Diffstat (limited to 'src')
-rw-r--r--src/osmo_gsm_tester/process.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/osmo_gsm_tester/process.py b/src/osmo_gsm_tester/process.py
index 66ecae5..4b22d0c 100644
--- a/src/osmo_gsm_tester/process.py
+++ b/src/osmo_gsm_tester/process.py
@@ -157,16 +157,27 @@ class Process(log.Origin):
return f
def launch(self):
+ preexec_fn = None
log.dbg('cd %r; %s %s' % (
os.path.abspath(str(self.run_dir)),
' '.join(['%s=%r'%(k,v) for k,v in self.popen_kwargs.get('env', {}).items()]),
' '.join(self.popen_args)))
+ if self.popen_args[0] == "sudo":
+ # sudo drops forwarding of signals sent by processes of the same
+ # process group, which means by default will drop signals from
+ # parent and children processes. By moving it to another group, we
+ # will later be able to kill it.
+ # Note: sudo documentation is wrong, since it states it only drops
+ # signals from children.
+ preexec_fn = os.setpgrp
+
self.process_obj = subprocess.Popen(
self.popen_args,
stdout=self.make_output_log('stdout'),
stderr=self.make_output_log('stderr'),
stdin=subprocess.PIPE,
+ preexec_fn=preexec_fn,
shell=False,
cwd=self.run_dir.path,
**self.popen_kwargs)