Home | History | Annotate | Download | only in cmdprofile
      1 """
      2 Sets up a subprocess to run any generic command in the background every
      3 few seconds (by default the interval is 60 secs)
      4 """
      5 
      6 import time, os, subprocess
      7 from autotest_lib.client.bin import profiler
      8 from autotest_lib.client.common_lib import utils, error
      9 
     10 class cmdprofile(profiler.profiler):
     11     version = 2
     12     supports_reboot = True
     13 
     14 
     15     def initialize(self, cmds=['ps'], interval=60, outputfile='cmdprofile',
     16                    outputfiles=None):
     17 
     18         # do some basic sanity checking on the parameters
     19         if not outputfiles and not outputfile:
     20             raise error.TestError(
     21                 'cmdprofile cannot run if neither outputfile nor outputfile '
     22                 'is specified')
     23         elif outputfiles and len(outputfiles) != len(cmds):
     24             raise error.TestError(
     25                 'cmdprofile paramter outputfiles has length %d and cmds has '
     26                 'length %d, but both lists must have the same length' %
     27                 (len(outputfiles), len(cmds)))
     28 
     29         self.interval = interval
     30         self.cmds = cmds
     31         if outputfiles:
     32             # outputfiles overrides outputfile
     33             self.outputfiles = outputfiles
     34         else:
     35             self.outputfiles = [outputfile] * len(cmds)
     36 
     37 
     38     def start(self, test):
     39         self.pid = os.fork()
     40         if self.pid:  # parent
     41             return
     42         else:  # child
     43             while True:
     44                 for cmd, outputfile in zip(self.cmds, self.outputfiles):
     45                     logfile = open(os.path.join(test.profdir, outputfile), 'a')
     46                     utils.run(cmd, stdout_tee=logfile, stderr_tee=logfile)
     47                     logfile.write('\n')
     48                     logfile.close()
     49                 time.sleep(self.interval)
     50 
     51 
     52     def stop(self, test):
     53         utils.nuke_pid(self.pid)
     54