diff options
author | Dan Crosta <dcrosta@10gen.com> | 2012-03-27 14:35:03 -0400 |
---|---|---|
committer | Dan Crosta <dcrosta@10gen.com> | 2012-03-27 14:35:03 -0400 |
commit | 0b22e48edb239767103c7225bb9d3ba988972e8f (patch) | |
tree | 49bf1da4841ed448f4b3a7fb9a33b8c8f8efe14d /buildscripts/buildlogger.py | |
parent | 3a431673f4659f3ddf58c2727ac18cfd28ed34ab (diff) | |
download | mongo-0b22e48edb239767103c7225bb9d3ba988972e8f.tar.gz |
correctly propagate SIGTERM to wrapped children in buildlogger
Diffstat (limited to 'buildscripts/buildlogger.py')
-rw-r--r-- | buildscripts/buildlogger.py | 21 |
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 |