| """top prints out CPU stats""" |
| |
| import os, subprocess, signal |
| import logging |
| from autotest_lib.client.bin import profiler |
| |
| |
| class top(profiler.profiler): |
| """ |
| Starts top on the DUT and polls every 5 seconds. Any processes with a |
| %cpu of zero will be stripped from the output. |
| """ |
| |
| version = 1 |
| |
| SCRIPT = "top -b -c -w 200 -d 5 -o '%CPU' -H | " \ |
| "awk '$1 ~ /[0-9]+/ && $9 == '0.0' {next} {print}'" |
| |
| def start(self, test): |
| self._output = open(os.path.join(test.profdir, "top"), "wb") |
| |
| logging.debug("Starting top") |
| |
| # Log the start time so a complete datetime can be computed later |
| subprocess.call(["date", "-Iseconds"], stdout=self._output) |
| |
| self._process = subprocess.Popen( |
| self.SCRIPT, |
| stderr=self._output, |
| stdout=self._output, |
| shell=True, |
| # We need to start a process group so we can kill the script's |
| # children. |
| preexec_fn=os.setpgrp, |
| close_fds=True) |
| |
| def stop(self, test): |
| logging.debug("Stopping top") |
| |
| # Kill the whole process group so top and awk die |
| os.killpg(self._process.pid, signal.SIGTERM) |
| |
| self._process.wait() |
| |
| logging.debug("Stopped top") |
| |
| self._output.close() |
| |
| def report(self, test): |
| pass |