#やりたいこと
以下に示すコードでは、iperrfを使用して,60秒間通信を行います。
課題点として、
プログラム実行中にCtrl+Cなどで、プログラムを強制終了すると、def perfTest(cc)関数内で実行したiperfコマンドやtcpdumpコマンドが実行されたままとなります。
そこで、Ctrl+C等で強制終了させた場合に、iperfやtcpdumpなどのプロセスも同時に終了させる方法はありますでしょうか?
有識者の方々ご教授の程よろしくお願いします。
python
1#!/usr/bin/python 2 3from mininet.topo import Topo 4from mininet.net import Mininet 5from mininet.node import CPULimitedHost 6from mininet.link import TCLink 7from mininet.util import dumpNodeConnections 8from mininet.log import setLogLevel 9 10import time 11import subprocess 12import sys 13import threading 14import csv 15from argparse import ArgumentParser 16 17pid = None 18 19def get_option(): 20 parser = ArgumentParser(description='explanation of program') 21 22 parser.add_argument('-c', '--cc', help="name of cc schemes", type=str, default='none') 23 24 return parser.parse_args() 25 26class SingleSwitchTopo(Topo): 27 "Single switch connected to n hosts." 28 def __init__(self, n=2, **opts): 29 Topo.__init__(self, **opts) 30 hosts=[] 31 for h in range(n): 32 # Each host gets 50%/n of system CPU 33 hosts.append(self.addHost('h%s' % (h + 1), 34 cpu=.5/n)) 35 # 10 Mbps, 5ms delay, 10% loss, 1000 packet queue 36 self.addLink(hosts[0], hosts[1], 37 bw=100, delay='5ms', loss=0, max_queue_size=86, use_tbf=True) 38 39def run_ccp(): 40 global pid 41 pid = subprocess.Popen(['sudo', '/home/eval-scripts/generic-cong-avoid/target/release/cubic', '--ipc=netlink'],stdout=subprocess.PIPE,stderr = subprocess.STDOUT) 42 with open('dump/cwnd.csv', 'w') as f: 43 for line in iter(pid.stdout.readline, b''): 44 print(line.rstrip().decode('utf8')) 45 output = (line.rstrip().decode('utf8').split(',')) 46 output_str = [str(n) for n in output] 47 if (output_str[0].isdigit()): 48 writer = csv.writer(f) 49 writer.writerow(output_str) 50 sys.stdout.flush() 51 52 53def perfTest(cc): 54 global pid 55 "Create network and run simple performance test" 56 topo = SingleSwitchTopo(n=2) 57 net = Mininet(topo=topo, 58 host=CPULimitedHost, link=TCLink) 59 net.start() 60 61 h1, h2 = net.get('h1', 'h2') 62 63 64 h1_dmp = h1.popen('tcpdump', '-x', '-tt', '-nn', '-Z', 'root', '-B', '1000', '-w', 'dump/receiver.pcap') 65 h2_dmp = h2.popen('tcpdump', '-x', '-tt', '-nn', '-Z', 'root', '-B', '1000', '-w', 'dump/sender.pcap') 66 67 h1_pid = h1.popen('iperf', '-s', '-p', '5001') 68 h2_pid = h2.popen(['iperf', '-c', h1.IP(), '-p', '5001', '-t', '60','-i', '1','-Z', 'ccp'],stdout=subprocess.PIPE,stderr = subprocess.STDOUT) 69 for line in iter(h2_pid.stdout.readline, b''): 70 #print(line.rstrip().decode('utf8')) 71 sys.stdout.flush() 72 73 74 h1_pid.kill() 75 h1_dmp.kill() 76 h2_pid.kill() 77 h2_dmp.kill() 78 if (cc == 'ccp'): 79 pid.kill() 80 net.stop() 81 82 83if __name__ == '__main__': 84 85 args = get_option() 86 setLogLevel('info') 87 if (args.cc == 'ccp'): 88 thread1 = threading.Thread(target=run_ccp) 89 thread1.setDaemon(True) 90 thread1.start() 91 time.sleep(1) 92 perfTest(args.cc) 93 sys.exit() 94 # thread1.join()
#追記
以下のサイトを参考にしたらできました。
https://qiita.com/qualitia_cdev/items/f536002791671c6238e3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/29 08:42