"""
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)