""" Sets up a subprocess to run any generic command in the background every few seconds (by default the interval is 60 secs) """ import time, os, subprocess from autotest_lib.client.bin import profiler from autotest_lib.client.common_lib import utils, error class cmdprofile(profiler.profiler): version = 2 supports_reboot = True def initialize(self, cmds=['ps'], interval=60, outputfile='cmdprofile', outputfiles=None): # do some basic sanity checking on the parameters if not outputfiles and not outputfile: raise error.TestError( 'cmdprofile cannot run if neither outputfile nor outputfile ' 'is specified') elif outputfiles and len(outputfiles) != len(cmds): raise error.TestError( 'cmdprofile paramter outputfiles has length %d and cmds has ' 'length %d, but both lists must have the same length' % (len(outputfiles), len(cmds))) self.interval = interval self.cmds = cmds if outputfiles: # outputfiles overrides outputfile self.outputfiles = outputfiles else: self.outputfiles = [outputfile] * len(cmds) def start(self, test): self.pid = os.fork() if self.pid: # parent return else: # child while True: for cmd, outputfile in zip(self.cmds, self.outputfiles): logfile = open(os.path.join(test.profdir, outputfile), 'a') utils.run(cmd, stdout_tee=logfile, stderr_tee=logfile) logfile.write('\n') logfile.close() time.sleep(self.interval) def stop(self, test): utils.nuke_pid(self.pid)