def run(self, outputdir=None): # set output path of perf data full_outputdir = fileutils.build_full_output_dir(basedir=outputdir, subdir=self.data_dir) if full_outputdir is None: # something went wrong when setting output dir, exit without perfing # TODO: unified output: "Error when setting up output dir of perf data" return if len(self.process_info) > 0: # perf on given process(es) for pid, pname in self.process_info.items(): cmd = self.build_cmd(pid, pname, full_outputdir) # TODO: unified output: "Now perf recording %s(%d)..." % (pname, pid) stdout, stderr = util.run_cmd(cmd) if stdout: fileutils.write_file( path.join(full_outputdir, "%s.stdout" % pname), stdout) if stderr: fileutils.write_file( path.join(full_outputdir, "%s.stderr" % pname), stderr) else: # perf the entire system cmd = self.build_cmd() stdout, stderr = util.run_cmd(cmd) if stdout: fileutils.write_file(path.join(full_outputdir, "perf.stdout"), stdout) if stderr: fileutils.write_file(path.join(full_outputdir, "perf.stderr"), stderr)
def save_sysconf(self, outputdir=None): cmd = ["sysctl", "-a"] path_limit_file = "/etc/security/limits.conf" # save output of `sysctl -a` full_outputdir = fileutils.build_full_output_dir( basedir=outputdir, subdir=self.config_dir) stdout, stderr = util.run_cmd(cmd) if stdout: fileutils.write_file(os.path.join(full_outputdir, "sysctl.conf"), stdout) if stderr: fileutils.write_file(os.path.join(full_outputdir, "sysctl.err"), stderr) # save system limits.conf shutil.copy(path_limit_file, full_outputdir)
def collector(self): # TODO: warn on non-empty output dir # call `collector` and store data to output dir base_dir = os.path.join(util.pwd(), "../") collector_exec = os.path.join(base_dir, "bin/collector") collector_outdir = fileutils.create_dir( os.path.join(self.full_outdir, "collector")) stdout, stderr = util.run_cmd(collector_exec) if stderr: logging.warning(str(stderr)) try: self.collector_data = json.loads(stdout) except json.JSONDecodeError: # TODO: unified output: "Error collecting system info.\n%s" % stderr return # save various info to seperate .json files for k, v in self.collector_data.items(): fileutils.write_file(os.path.join(collector_outdir, "%s.json" % k), json.dumps(v, indent=2))
def du_total(filepath): # TODO: support relative path, this require `collector` to output cwd of process cmd = ["du", "-s", str(filepath)] return util.run_cmd(cmd)
def du_subfiles(filepath): # TODO: support relative path, this require `collector` to output cwd of process filelist = glob(filepath+"/*") cmd = ["du", "-s"] + filelist return util.run_cmd(cmd)
def lsof(pid): cmd = ["lsof", "-p", "%s" % pid] return util.run_cmd(cmd)