質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3171閲覧

Pythonコードを強制終了させた際に、実行中のプロセスも終了させたい。

man_

総合スコア45

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/29 07:12

編集2021/07/29 12:20

#やりたいこと
以下に示すコードでは、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Ctrl-Cなどを受けたときに、そのシグナルを捕捉してフラグを立て、「for line in iter(h2_pid.stdout.readline, b''):」のループの中でフラグを見て終了判定すればいいのではないかと思います。

投稿2021/07/29 08:26

編集2021/07/29 08:27
TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

man_

2021/07/29 08:42

TakaiYさん回答ありがとうございます。 教えていただいた方法で実装してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問