]> git-server-git.apps.pok.os.sepia.ceph.com Git - teuthology.git/commitdiff
daemon-helper: optional kill an entire process group
authorSage Weil <sage@inktank.com>
Thu, 27 Mar 2014 04:41:28 +0000 (21:41 -0700)
committerSage Weil <sage@inktank.com>
Mon, 30 Jun 2014 20:35:53 +0000 (13:35 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
teuthology/task/daemon-helper

index 6dc92b2ef0afc537d0946801f91b633abca28cc8..ca0bbb0c6ff9e47897d6c3b1f1b52f02740e4bfe 100755 (executable)
@@ -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 <signal> [--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