From 1cd807654306eee3b1b9c529d2aebcfc1c880651 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 26 Mar 2014 21:41:28 -0700 Subject: [PATCH] daemon-helper: optional kill an entire process group Signed-off-by: Sage Weil --- teuthology/task/daemon-helper | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/teuthology/task/daemon-helper b/teuthology/task/daemon-helper index 6dc92b2ef0afc..ca0bbb0c6ff9e 100755 --- a/teuthology/task/daemon-helper +++ b/teuthology/task/daemon-helper @@ -12,6 +12,8 @@ then wait for EOF on stdin. When EOF is seen on stdin, the child process is killed. When the child process exits, this helper exits too. + +usage: daemon-helper [--kill-group] [nostdin] command... """ import fcntl @@ -28,6 +30,11 @@ if sys.argv[1] == "term": cmd_start = 2 +group = False +if sys.argv[cmd_start] == "--kill-group": + group = True + cmd_start += 1 + nostdin = False if sys.argv[cmd_start] == "nostdin": nostdin = True @@ -43,6 +50,7 @@ else: proc = subprocess.Popen( args=sys.argv[cmd_start:], stdin=devnull, + preexec_fn=os.setsid, ) flags = fcntl.fcntl(0, fcntl.F_GETFL) @@ -55,11 +63,18 @@ while True: data = os.read(0, 1) if not data: saw_eof = True - proc.send_signal(end_signal) + if not group: + proc.send_signal(end_signal) + else: + os.killpg(proc.pid, end_signal) break else: sig, = struct.unpack('!b', data) - proc.send_signal(sig) + if not group: + proc.send_signal(sig) + else: + os.killpg(proc.pid, end_signal) + if proc.poll() is not None: # child exited -- 2.39.5