From 697f1cd407355c6fb6b35edc4b6ae407b071701e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com> Date: Fri, 4 Mar 2011 10:41:17 +0000 Subject: [PATCH] - do singal translation for cloudooo, as paster is not killing children on SIGTERM, but on SIGINT only git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@43965 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../erp5/src/slapos/recipe/erp5/__init__.py | 6 ++-- .../erp5/src/slapos/recipe/erp5/execute.py | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py b/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py index 169dc9e023..5a49090eb5 100644 --- a/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py +++ b/slapos/recipe/erp5/src/slapos/recipe/erp5/__init__.py @@ -316,9 +316,9 @@ class Recipe(BaseSlapRecipe): conversion_server_dict)) self.path_list.append(config_file) self.path_list.extend(zc.buildout.easy_install.scripts([(name, - __name__ + '.execute', 'execute')], self.ws, sys.executable, - self.wrapper_directory, arguments=[self.options['ooo_paster'].strip(), - 'serve', config_file])) + __name__ + '.execute', 'execute_with_signal_translation')], self.ws, + sys.executable, self.wrapper_directory, + arguments=[self.options['ooo_paster'].strip(), 'serve', config_file])) self.connection_dict.update(**{ name + '_port': conversion_server_dict['port'], name + '_ip': conversion_server_dict['ip'] diff --git a/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py b/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py index 78b34810dd..4386bbdd6e 100644 --- a/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py +++ b/slapos/recipe/erp5/src/slapos/recipe/erp5/execute.py @@ -1,5 +1,34 @@ +import sys import os +import signal +import subprocess +import time + def execute(args): """Portable execution with process replacement""" # Note: Candidate for slapos.lib.recipe os.execv(args[0], args) + +child_pg = None +def sig_handler(signal, frame): + print 'Received signal %r, killing children and exiting' % signal + if child_pg is not None: + os.killpg(child_pg, signal.SIGHUP) + os.killpg(child_pg, signal.SIGTERM) + sys.exit(0) + +signal.signal(signal.SIGINT, sig_handler) +signal.signal(signal.SIGQUIT, sig_handler) +signal.signal(signal.SIGTERM, sig_handler) + +def execute_with_signal_translation(args): + """Run process as children and translate from SIGTERM to another signal""" + child = subprocess.Popen(args, close_fds=True, preexec_fn=os.setsid) + child_pg = child.pid + try: + while True: + print 'Running' + time.sleep(10) + finally: + os.killpg(child_pg, signal.SIGHUP) + os.killpg(child_pg, signal.SIGTERM) -- 2.30.9