git.fiddlerwoaroof.com
main.py
4617adb3
 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)