From 64941e51e3064c7b6777ecb4b5f720f0ee044b0c Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Fri, 27 Jan 2017 06:33:26 +0100 Subject: [PATCH] kill phantomjs if stalled (#14606) --- mandayejs/mandaye/utils.py | 59 +++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/mandayejs/mandaye/utils.py b/mandayejs/mandaye/utils.py index 249948d..56309ca 100644 --- a/mandayejs/mandaye/utils.py +++ b/mandayejs/mandaye/utils.py @@ -17,6 +17,7 @@ import os import json import subprocess import logging +import multiprocessing from django.conf import settings @@ -28,29 +29,43 @@ logger = logging.getLogger(__name__) def exec_phantom(data, script='do_login.js'): - phantom = subprocess.Popen([ - settings.PHANTOM_JS_BINARY, - '--ignore-ssl-errors=yes', '--ssl-protocol=any', - os.path.join(settings.BASE_DIR, 'mandayejs', script)], - close_fds=True, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE - ) + result = None + waiting_time = getattr(settings, 'PHANTOM_JS_WAITING_TIME', 10) + + def run(send_end): + phantom = subprocess.Popen([ + settings.PHANTOM_JS_BINARY, + '--ignore-ssl-errors=yes', '--ssl-protocol=any', + os.path.join(settings.BASE_DIR, 'mandayejs', script)], + close_fds=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE + ) + stdout, stderr = phantom.communicate(json.dumps(data)) + + try: + result = json.loads(stdout) + except (ValueError,): + result = {"result": "failure, couldn't decode JSON"} + logger.error(stdout) + + if result.get('stderr', None): + logger.warning(result['stderr']) + + send_end.send(result) + + recv_end, send_end = multiprocessing.Pipe(False) + process = multiprocessing.Process(target=run, args=(send_end,)) + process.start() + process.join(waiting_time) + + if process.is_alive(): + process.terminate() + logger.error("Phantomjs process stalled with conetext : %s " % data.pop('locators')) + result = {'result': 'failure'} + else: + result = recv_end.recv() - stdout, stderr = phantom.communicate(json.dumps(data)) - - try: - result = json.loads(stdout) - except (ValueError,): - result = {"result": "failure, couldn't decode JSON"} - logger.error(stdout) - - # only kill process if it's still running - if phantom.poll() is None: - phantom.terminate() - - if result.get('stderr'): - logger.warning(result['stderr']) return result -- 2.11.0