From 8ad751b6610aca0f3064a831d3c55a4c366d12e9 Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Wed, 13 May 2015 10:05:12 +0200 Subject: [PATCH 1/2] add a simplest SIGCHLD handler in order to avoid zombies in the docker container governed by the script --- governor.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/governor.py b/governor.py index 2f9132cf..924535f6 100755 --- a/governor.py +++ b/governor.py @@ -19,6 +19,14 @@ def sigterm_handler(signo, stack_frame): sys.exit() +# handle SIGCHILD, since we are the equivalent of the INIT process +def sigchld_handler(signo, stack_frame): + try: + os.waitpid(-1, os.WNOHANG) + except OSError: + pass + + class Governor: INSTANCE_METADATA_URL = "http://169.254.169.254/latest/meta-data/" @@ -96,4 +104,5 @@ def main(): if __name__ == '__main__': logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.INFO) signal.signal(signal.SIGTERM, sigterm_handler) + signal.signal(signal.SIGCHLD, sigchld_handler) main() From 609a4b2fc60509f8891589a96c2688664bd8789e Mon Sep 17 00:00:00 2001 From: Oleksii Kliukin Date: Wed, 13 May 2015 12:22:17 +0200 Subject: [PATCH 2/2] loop until we reap all terminated children. --- governor.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/governor.py b/governor.py index 924535f6..d568da86 100755 --- a/governor.py +++ b/governor.py @@ -22,7 +22,10 @@ def sigterm_handler(signo, stack_frame): # handle SIGCHILD, since we are the equivalent of the INIT process def sigchld_handler(signo, stack_frame): try: - os.waitpid(-1, os.WNOHANG) + while True: + ret = os.waitpid(-1, os.WNOHANG) + if ret == (0, 0): + break except OSError: pass