"""
Sets up a subprocess to run any generic command in the background every
few seconds (by default the interval is 60 secs)
"""
import os
import time
from autotest.client import profiler
from autotest.client.shared import utils, error
[docs]class cmdprofile(profiler.profiler):
version = 2
supports_reboot = True
[docs] def initialize(self, cmds=['ps'], interval=60, outputfile='cmdprofile',
outputfiles=None, **dargs):
# 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 parameter 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)
[docs] 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)
[docs] def stop(self, test):
utils.nuke_pid(self.pid)