summaryrefslogtreecommitdiff
path: root/buildscripts/buildlogger.py
diff options
context:
space:
mode:
authorDan Crosta <dcrosta@10gen.com>2012-03-27 14:35:03 -0400
committerDan Crosta <dcrosta@10gen.com>2012-03-27 14:35:03 -0400
commit0b22e48edb239767103c7225bb9d3ba988972e8f (patch)
tree49bf1da4841ed448f4b3a7fb9a33b8c8f8efe14d /buildscripts/buildlogger.py
parent3a431673f4659f3ddf58c2727ac18cfd28ed34ab (diff)
downloadmongo-0b22e48edb239767103c7225bb9d3ba988972e8f.tar.gz
correctly propagate SIGTERM to wrapped children in buildlogger
Diffstat (limited to 'buildscripts/buildlogger.py')
-rw-r--r--buildscripts/buildlogger.py21
1 files changed, 19 insertions, 2 deletions
diff --git a/buildscripts/buildlogger.py b/buildscripts/buildlogger.py
index c7adc49f6ac..d5fad906be0 100644
--- a/buildscripts/buildlogger.py
+++ b/buildscripts/buildlogger.py
@@ -25,6 +25,7 @@ test, in order to let the buildlogs web app display the full output sensibly.)
import functools
import os
import os.path
+import signal
import subprocess
import sys
import time
@@ -293,9 +294,25 @@ def loop_and_callback(command, callback):
stderr=subprocess.STDOUT,
)
+ def handle_sigterm(signum, frame):
+ proc.send_signal(signum)
+
+ # register a handler to delegate SIGTERM
+ # to the child process
+ orig_handler = signal.signal(signal.SIGTERM, handle_sigterm)
+
while proc.poll() is None:
- line = proc.stdout.readline().strip('\r\n')
- callback(line)
+ try:
+ line = proc.stdout.readline().strip('\r\n')
+ callback(line)
+ except IOError:
+ # if the signal handler is called while
+ # we're waiting for readline() to return,
+ # don't show a traceback
+ break
+
+ # restore the original signal handler, if any
+ signal.signal(signal.SIGTERM, orig_handler)
callback(None)
return proc.returncode