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()