def _runWorker(self, worker_id, logDir): iteration = 0 while worker_id in self.threads: iteration += 1 log_path = self._workerLogFile(worker_id, iteration, logDir) logging.info("adding worker. script: %s, log: %s", self.worker_path, log_path) with open(log_path, 'a') as logfile: def writeline(msg): logfile.write(msg + '\n') env = dict(os.environ) env['UFORA_WORKER_BASE_PORT'] = str(30009 + 2 * self.num_ever_started) proc = SubprocessRunner.SubprocessRunner( [sys.executable, '-u', self.worker_path], writeline, writeline, env=env) logfile.write("***Starting worker***\n") logging.info("Starting worker %s", worker_id) logfile.flush() proc.start() self.processes[worker_id] = proc proc.wait() logging.info("Worker exited: %s", worker_id)
def tryToStartRelayProcess(self, relayScript): env = dict(os.environ) env['NODE_ENV'] = 'test' hasStartedEvent = threading.Event() def onStdOut(msg): hasStartedEvent.set() logging.critical("RELAY STDOUT> %s", msg) def onStdErr(msg): logging.critical("RELAY STDERR> %s", msg) coffeeCommand = './run_coffee.sh' if 'UFORA_DEBUG_RELAY' in os.environ: coffeeCommand = 'coffee-debug' nodejsOptions = [] if 'UFORA_PROFILE_RELAY' in os.environ: nodejsOptions = ['--nodejs', '--prof'] args = [ relayScript, '--port', str(self.relayPort), '--gatewayport', str(self.subscribableWebObjectsPort) ] command = [ 'forever', '-f', '-l', self.relayLogFile, '--workingDir', self.webPath, 'start', '-c', coffeeCommand ] + nodejsOptions + args SubprocessRunner.SubprocessRunner(command, onStdOut, onStdErr, env).start() return hasStartedEvent
def startSharedState(self): cacheDir = Setup.config().getConfigValue( "SHARED_STATE_CACHE", os.path.join(Setup.config().fakeAwsBaseDir, 'ss_cache')) logging.info( "Starting shared state with cache dir '%s' and log file '%s'", cacheDir, self.sharedStateLogFile) with DirectoryScope.DirectoryScope(self.sharedStatePath): args = [ 'forever', '--killSignal', 'SIGTERM', '-l', self.sharedStateLogFile, 'start', '-c', 'python', self.sharedStateMainline, '--cacheDir', cacheDir, '--logging', 'info' ] def sharedStateStdout(msg): logging.info("SHARED STATE OUT> %s", msg) def sharedStateStderr(msg): logging.info("SHARED STATE ERR> %s", msg) startSharedState = SubprocessRunner.SubprocessRunner( args, sharedStateStdout, sharedStateStderr, dict(os.environ)) startSharedState.start() startSharedState.wait(60.0) startSharedState.stop()
def start(self): assert not self.hasStarted if self.actuallyRunOutOfProcess: def onStdout(msg): logging.info("OutOfProcessDownloader Out> %s", msg) def onStderr(msg): logging.info("OutOfProcessDownloader Err> %s", msg) self.childSubprocess = SubprocessRunner.SubprocessRunner( [sys.executable, __file__, str(self.childSocket.fileno())], onStdout, onStderr) self.childSubprocess.start() self.hasStarted = True self.backgroundThread = ManagedThread.ManagedThread( target=self.watchChild_) self.backgroundThread.start() else: self.hasStarted = True self.backgroundThread = ManagedThread.ManagedThread( target=self.executeChild_) self.backgroundThread.start()
def runForeverCommand(script, foreverCommand, timeout=60.0): args = ['forever', foreverCommand, script] def foreverStdOut(msg): logging.info("FOREVER(%s) OUT> %s", script, msg) def foreverStdErr(msg): logging.info("FOREVER(%s) ERR> %s", script, msg) subprocess = SubprocessRunner.SubprocessRunner(args, foreverStdOut, foreverStdErr, dict(os.environ)) subprocess.start() subprocess.wait(timeout) subprocess.stop()
def test_subprocess_runner_exception(self): err = [] out = [] runner = SubprocessRunner.SubprocessRunner( ["/bin/bash", "-c", "echo toErr 1>&2; echo toNormal"], out.append, err.append ) runner.start() self.assertEqual(runner.wait(10), 0) self.assertEqual(out, ['toNormal']) self.assertEqual(err, ["toErr"]) runner.stop()
def test_subprocess_runner_runner(self): err = [] out = [] runner = SubprocessRunner.SubprocessRunner( ["/bin/echo", "asdf"], out.append, err.append ) runner.start() self.assertEqual(runner.wait(10), 0) self.assertEqual(out, ["asdf"]) self.assertEqual(err, []) runner.stop()
def startGatewayService(self): args = [ 'forever', '--killSignal', 'SIGTERM', '-l', self.gatewayLogFile, 'start', '-c', 'python', self.gatewayServiceMainline, '--cluster-name', 'test' ] def gatewayStdout(msg): logging.info("GATEWAY OUT> %s", msg) def gatewayStderr(msg): logging.info("GATEWAY ERR> %s", msg) gatewayProc = SubprocessRunner.SubprocessRunner( args, gatewayStdout, gatewayStderr, dict(os.environ)) gatewayProc.start() gatewayProc.wait(60.0) gatewayProc.stop()
def onSubscribableConnection(self, sock, _): logging.info("creating a new process to handle connection") handlerPid = None with self._lock: if self.shouldStop(): return scriptName = os.path.join( os.path.split(__file__)[0], 'handleBackendGatewayConnection.py') def onStdOut(line): logging.info("%s > %s", handlerPid, line) def onStdErr(line): logging.error("%s > %s", handlerPid, line) connectProc = SubprocessRunner.SubprocessRunner( [sys.executable, scriptName], onStdOut, onStdErr) self.socketsToDisconnectOnExit.append(sock) connectProc.start() handlerPid = connectProc.pid with self._lock: self.procsToKillOnExit.add(connectProc) toWrite = pickle.dumps({ 'socketFd': sock.fileno(), 'sharedStateAddress': self.sharedStateAddress }) connectProc.write(struct.pack('I', len(toWrite))) connectProc.write(toWrite) connectProc.flush() def waitForProcToFinish(): connectProc.wait() connectProc.stop() sock.close() threading.Thread(target=waitForProcToFinish).start()
def __call__(self): args = ['forever', self.foreverCommand, self.script] response = [] def foreverStdOut(msg): response.append("FOREVER(%s) OUT> %s" % (self.script, msg)) def foreverStdErr(msg): response.append("FOREVER(%s) ERR> %s" % (self.script, msg)) subprocess = SubprocessRunner.SubprocessRunner(args, foreverStdOut, foreverStdErr, self.environ) subprocess.start() subprocess.wait(self.timeout) subprocess.stop() return "\n".join(response)
def testUsingCoffeescript(self): args = [ "mocha", "--reporter", "spec", "--compilers", "coffee:coffee-script/register", "testSubscribableWebObjects.coffee", "-b" ] def onOut(l): logging.info("Mocha Out> %s", l) def onErr(l): logging.info("Mocha Err> %s", l) subprocess = SubprocessRunner.SubprocessRunner(args, onOut, onErr) subprocess.start() result = subprocess.wait(720) subprocess.stop() self.assertEqual(result, 0)
def _runWorker(self, worker_id, logDir): iteration = 0 while worker_id in self.threads: iteration += 1 log_path = self._workerLogFile(worker_id, iteration, logDir) logging.info("adding worker. script: %s, log: %s", self.worker_path, log_path) with open(log_path, 'a') as logfile: def writeline(msg): logfile.write(msg + '\n') env = dict(os.environ) env['UFORA_WORKER_BASE_PORT'] = str(30009 + 2 * self.num_ever_started) core_log = log_path.split('.') core_log.insert(-1, 'core') env['UFORA_WORKER_CORE_LOG_FILE'] = '.'.join(core_log) env['CUMULUS_VECTOR_MB'] = "400" env['CUMULUS_MAX_MB'] = "500" env['CUMULUS_TRACK_TCMALLOC'] = '0' env['CUMULUS_DISK_STORAGE_SUBDIR'] = str(worker_id) self.num_ever_started += 1 proc = SubprocessRunner.SubprocessRunner( [sys.executable, '-u', self.worker_path], writeline, writeline, env=env) logfile.write("***Starting worker***\n") logging.info("Starting worker %s", worker_id) logfile.flush() proc.start() self.processes[worker_id] = proc proc.wait() logging.info("Worker exited: %s", worker_id)
def runScript_(self, script): print print "Running %s" % script print "with a timeout of %s sec"% self.getTimeout(script) if sys.platform == 'linux2': directory, filename = os.path.split(script) args = [sys.executable, "-u", '-c', "print 'started'; execfile('%s')" % filename] with DirectoryScope(directory): tries = 0 runner = None while tries < 5 and runner is None: startedEvent = threading.Event() def printOutput(line): if line == 'started': startedEvent.set() print "Script %s started" % filename else: print "OUT> %s\n" % line, def printErr(line): print "ERR> %s\n" % line, runner = SubprocessRunner.SubprocessRunner( args, printOutput, printErr, self.envVars ) runner.start() startedEvent.wait(5) if not startedEvent.isSet(): runner.terminate() runner = None tries = tries + 1 print "Retrying script ", filename, " as python failed to start." if runner is None: print "Test %s failed to start a python process in 5 tries" % filename return False else: result = runner.wait(self.getTimeout(script)) if result is None: try: runner.terminate() except: print "Failed to terminate test runner: ", traceback.format_exc() print "Test %s timed out" % filename, return False runner.stop() if result != 0: print "Test %s failed" % filename, return False return True else: subprocess.check_call('cd "%s" & c:\python27\python.exe %s ' % os.path.split(script), shell = True ) return True