# HG changeset patch # User Marcin Kuzminski # Date 2018-03-28 11:27:03 # Node ID 042cb4c7576a1c24b40ea99a1389cde7216931c2 # Parent 499461c1fed596fa4e3beb95b62317ac195015cc processes: better handling of PID that are not part of RhodeCode processes. - in some cases for multiple gunicorn instances the PID sent is not from rhodecode which would lead to AccessDenied errors. We prevent from crashing the server on this type of errors. diff --git a/rhodecode/apps/admin/views/process_management.py b/rhodecode/apps/admin/views/process_management.py --- a/rhodecode/apps/admin/views/process_management.py +++ b/rhodecode/apps/admin/views/process_management.py @@ -105,9 +105,10 @@ class AdminProcessManagementView(BaseApp def process_management_signal(self): pids = self.request.json.get('pids', []) result = [] + def on_terminate(proc): msg = "process `PID:{}` terminated with exit code {}".format( - proc.pid, proc.returncode) + proc.pid, proc.returncode or 0) result.append(msg) procs = [] @@ -121,15 +122,22 @@ class AdminProcessManagementView(BaseApp children = proc.children(recursive=True) if children: - print('Wont kill Master Process') + log.warning('Wont kill Master Process') else: procs.append(proc) for p in procs: - p.terminate() + try: + p.terminate() + except psutil.AccessDenied as e: + log.warning('Access denied: {}'.format(e)) + gone, alive = psutil.wait_procs(procs, timeout=10, callback=on_terminate) for p in alive: - p.kill() + try: + p.kill() + except psutil.AccessDenied as e: + log.warning('Access denied: {}'.format(e)) return {'result': result}