0

10 個の ping を送信することで、同時に複数の IP に ping を送信する小さなプログラムがあります。これにより、結果が dict に記録され、ステータスがページに出力されます。

ただし、プログラムが常にpingを実行できるようにし、ユーザーが最大pingカウントに依存するのではなく、プログラムを停止できるようにしたいと考えています。

import os
import re
import time
import sys
import subprocess
import Queue
import threading

class pinger:

    def __init__(self,hosts):
        self.q = Queue.Queue()
        self.all_results = []
        self.hosts = hosts

    def send_ping(self,q,ip):
        self.q.put(self.record_results(ip))

    def record_results(self,ip):
        ping_count = 0

        host_results = {
            "host" : ip,
            "device" : None,
            "sent_count" : 0,
            "success_count": 0,
            "fail_count": 0,
            "failed_perc": 0,
            "curr_status": None
        }

        while ping_count < 10:
            rc = subprocess.call(['ping', '-c', '1', '-W', '1', ip], stdout=open('/dev/null', 'w'), stderr=open('/dev/null', 'w'))
            ping_count += 1

            # update stats

            host = host_results['host']
            sent_count = host_results['sent_count']
            success_count = host_results['success_count']
            fail_count = host_results['fail_count']
            failed_perc = host_results['failed_perc']
            curr_status = host_results['curr_status']

            sent_count += 1

            if rc == 0:
                success_count += 1
                curr_status = "Successful Response"
            else:
                fail_count += 1
                curr_status = "Request Timed Out"

            failed_perc =  ( fail_count / sent_count ) * 100

            host_results.update({'failed_perc': failed_perc, 'fail_count': fail_count, 'success_count': success_count, 'curr_status': curr_status, 'sent_count': sent_count})
            time.sleep(0.5)
            print host_results
        self.all_results.append(host_results)
        return True

    def go(self):
        for i in self.hosts:
            t = threading.Thread(target=self.send_ping, args = (self.q,i))
            t.daemon = True
            t.start()

ありがとう、

4

1 に答える 1

1

while ping_count < 10条件を に変更できますwhile self.should_ping:(変数は に初期化されますTrue)。また、すべての結果を収集するために待機するメイン ループがある場合は、例外ハンドラでラップしtry: except KeyboardInterrupt:て設定pinger.should_pingすることができます。False

SIGINTそれ以外の場合は、@bereal で言及されているようにシグナルに登録し、そこにshould_ping変数を設定できますFalse

于 2013-11-09T19:39:26.200 に答える