def simple_sh(cmd, log_execution=True, *args, **kwargs): ''' like subprocess.check_call, but returning the pid the process was given ''' if STRACE_ENABLED: strace = open('strace.log', 'at') print >> strace, "= " * 32 print >> strace, repr(cmd) cmd = ['strace'] + list(cmd) pop = Popen(cmd, *args, stderr=strace, **kwargs) else: pop = Popen(cmd, *args, **kwargs) pid = pop.pid startTime = time.time() rc = pop.wait() endTime = time.time() delta = endTime - startTime LOG.debug('statistics for "%s"' % ' '.join(cmd)) if log_execution: log_common.status_line('Execution Time: %f Sec Cmd "%s"' % (delta, ' '.join(cmd))) #LOG.debug('Execution Time: %f Sec Cmd "%s"' % (delta, ' '.join(cmd))) if rc != 0: exc = CalledProcessError(rc, cmd) exc.pid = pid raise exc return pid
def profiled_sh(cmd, log_execution=True, *args, **kwargs): ''' like subprocess.check_call, but returning the pid the process was given and logging as INFO the final content of /proc/PID/stat ''' pop = Popen(cmd, *args, **kwargs) pid = pop.pid fn = '/proc/%d/status' % pid LOG.debug('retrieving %s statistics to caller dictionary' % fn) proc_stats = '-- no /proc/PID/status data --' rc = 0 startTime = time.time() while True: time.sleep(1.0) rc = pop.poll() if rc is not None: break try: proc = file(fn, 'rt') proc_stats = proc.read() proc.close() del proc except IOError: LOG.warning('unable to get stats from %s' % fn) endTime = time.time() delta = endTime - startTime LOG.debug('statistics for "%s"' % ' '.join(cmd)) if log_execution: log_common.status_line('Execution Time: "%f" Sec Cmd "%s"' % (delta, ' '.join(cmd))) #LOG.debug('Execution Time: "%f" Sec Cmd "%s"' % (delta, ' '.join(cmd))) LOG.debug(proc_stats) if rc != 0: exc = CalledProcessError(rc, cmd) exc.pid = pid raise exc return pid