tracerouteを並列実行する

こういうのがあると便利なときがあるので。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import subprocess
import optparse

class Tracer:
	def __init__(self, traceroute='/usr/sbin/traceroute', processes=4, targets=['127.0.0.1']):
		self.traceroute = traceroute
		self.processes = processes
		self.targets = targets
		self.results = []
	
	def __dojob(self, jobs):
		tracers = []
		for target in jobs:
			tracers.append(subprocess.Popen(args=self.traceroute + ' ' + target, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True))
		for tracer in tracers:
			self.results.append(tracer.communicate())
	
	def trace(self):
		while len(self.targets) != 0:
			jobs = []
			for i in xrange(self.processes):
				if len(self.targets) != 0:
					jobs.append(self.targets.pop(0))
			self.__dojob(jobs)
	
	def get_results(self):
		return self.results
		
def parse_options():
	parser = optparse.OptionParser()
	parser.add_option('-t', '--traceroute', dest='traceroute', help='traceroute command', default='/usr/sbin/traceroute')
	parser.add_option('-p', '--processes', dest='processes', type='int', help='number of processes', default=4)
	parser.add_option('-f', '--file', dest='targetfile', help='target list file', default='iplist.txt')
	return parser.parse_args()


def main():
	(options, args) = parse_options()
	f = open(options.targetfile)
	targets = []
	for line in f:
		targets.append(line.rstrip())
	tracer = Tracer(traceroute=options.traceroute, processes=options.processes, targets=targets)
	tracer.trace()
	results = tracer.get_results()
	for result in results:
		print result[0]
		print '------------------------------------------------------------'

if __name__ == '__main__':
	main()