from __future__ import division,print_function import subprocess import time def start_iostat(): command = subprocess.Popen(['/usr/bin/iostat', '-dmx', '1'], bufsize=1, stdout=subprocess.PIPE) return command class Averager(object): def __init__(self): self.values = [] self.average = 0 self.len = 0 def update(self, value): self.values.append(value) self.len += 1 value /= self.len self.average = (self.average / self.len) * (self.len-1) + value return self @property def value(self): return self.values[-1] def get_data(command): command.stdout.readline() # skip header command.stdout.readline() # skip blank line table_headers = tuple(command.stdout.readline().split()) yield table_headers averages = [Averager() for __ in range(len(table_headers)-1)] while True: line = command.stdout.readline().strip() if line == '': time.sleep(1) line = command.stdout.readline().strip() continue line = line.split() device,nums = line[0], tuple(float(x) for x in line[1:]) for n,an in zip(nums, averages): an.update(n) yield zip((device,)+nums, (device,) + tuple(x.value for x in averages)) def print_data(command): dat = get_data(command) table_headers = ('',)+dat.next() fmt_str = '\t'.join(['%8s', '%8s'] + ['% 7.2f'] * (len(table_headers)-2)) print(('% 9s' * (len(table_headers))) % tuple(table_headers), sep='') for line in dat: nums, avg = zip(*line) print(fmt_str % (('real:',) + nums), sep='') print(fmt_str % (('avg:',) + nums), sep='') if __name__ == '__main__': dat = start_iostat() print_data(dat)