4

私はPythonを初めて使用するので、Linuxマシン上のネットワークインターフェイス(ツールnloadなど)の「平均速度」を計算する必要があります。以下のコードは、送受信されたバイト数を示しています。誰かが私のネットワークインターフェイスの平均速度を印刷するのを手伝ってくれたら幸いです。

def main():
    rx_bytes, tx_bytes = get_network_bytes('eth0')
    print '%i bytes received' % rx_bytes
    print '%i bytes sent' % tx_bytes

def get_network_bytes(interface):
    for line in open('/proc/net/dev', 'r'):
        if interface in line:
            data = line.split('%s:' % interface)[1].split()
            rx_bytes, tx_bytes = (data[0], data[8])
            return (int(rx_bytes), int(tx_bytes))

if __name__ == '__main__':
    main()
4

1 に答える 1

0

main()とget_network_bytes()を取得し、Pythonプロセスでラップします。

import subprocess
import time
from daemon import runner
import datetime

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/YOUR_PROCESS_NAME.pid'
        self.pidfile_timeout = 5
    def run(self):

        counter1 = 0
        counter_log = 0
        try:
            while True:

                # INSERT YOUR FUNCTIONS HERE

                # SET YOUR LOOP SLEEP TIMER (IN SECONDS) HERE
                time.sleep(60)

        except Exception, e:
            raise

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

次に、「python myscript.py start」で実行するか、停止または再起動すると、プロセスIDが画面に出力されます。これをバックグラウンドで実行している場合は、そのスクリプトを他のプログラムの一部としてインポートしてクエリを実行する必要があります。または、ループするたびに結果を一時ファイルに出力してから、他のプログラムにクエリを実行させることができます。その一時ファイル。「これを行うにはいくつかの異なる方法があります」

編集:

このようなものから始めてカスタマイズします。これは実際にはそれを実行する唯一の方法です。Linuxでのみ機能するifconfigの厄介な解析ではなく、psutilのような別のライブラリをお勧めします。

「必ずインターフェースを変更してください。私はWLAN0を使用していますが、別のものを使用している可能性があります」

次のスクリプトは、60秒ごとにその直前の平均TXおよびRXレートを画面に出力します。

import os
import subprocess
import time
from daemon import runner
import datetime
import re 

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/bandwidth_counter.pid'
        self.pidfile_timeout = 5
    def run(self):
        rx_megabits_new = 0
        tx_megabits_new = 0
        try:
                while True:
                        output = subprocess.Popen(['ifconfig', "wlan0"], stdout=subprocess.PIPE).communicate()[0]
                        rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0]
                        tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0]
                        rx_megabits = (((int(rx_bytes) * 8) / 1024) / 1024)
                        tx_megabits = (((int(tx_bytes) * 8) / 1024) / 1024)
                        current_rx_usage = rx_megabits - rx_megabits_new
                        current_tx_usage = tx_megabits - tx_megabits_new
                        rx_megabits_new = rx_megabits
                        tx_megabits_new = tx_megabits 
                        print 'average megabits received', current_rx_usage / 60
                        print 'average kilobits received', (current_rx_usage * 1024) / 60
                        print 'average megabits sent', current_tx_usage / 60
                        print 'average kilobits sent', (current_tx_usage * 1024) / 60
                        time.sleep(60)

        except Exception, e:
            raise


app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

繰り返しますが、これは「python myscript.py start」で機能し、停止して再起動します。画面に印刷するのではなく、開いて書き込むファイルを追加することをお勧めします。また、ファイルが急速に大きくなるため、スペースを節約するために、gzip.open()を使用して書き込み用にファイルを開くことをお勧めします。

編集:

今回は同じデーモンがファイル/tmp/netstats_counter.logに書き込みます。これは、「1分間隔でのKB /秒単位のtxレート、1分間隔でのKB /秒単位の平均rxレート、UNIXタイムスタンプ」を含むcsvです。

import os
import subprocess
import time
from daemon import runner
import datetime
import re 

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/twitter_counter.pid'
        self.pidfile_timeout = 5
    def run(self):
        rx_megabits_new = 0
        tx_megabits_new = 0
        try:
                while True:
                        output_csv = open("/tmp/netstats_counter.log", 'a')
                        output = subprocess.Popen(['ifconfig', "wlan0"], stdout=subprocess.PIPE).communicate()[0]

                        rx_bytes = re.findall('RX bytes:([0-9]*) ', output)[0]
                        tx_bytes = re.findall('TX bytes:([0-9]*) ', output)[0]
                        rx_megabits = (((int(rx_bytes) * 8) / 1024) / 1024)
                        tx_megabits = (((int(tx_bytes) * 8) / 1024) / 1024)

                        current_rx_usage = (rx_megabits - rx_megabits_new) / 60
                        current_tx_usage = (tx_megabits - tx_megabits_new) / 60
                        current_rx_usage_kb = current_rx_usage * 1024
                        current_tx_usage_kb = current_tx_usage * 1024

                        rx_megabits_new = rx_megabits
                        tx_megabits_new = tx_megabits 

                        now = str(datetime.datetime.now())

                        col1 = str(current_tx_usage_kb) 
                        col2 = str(current_rx_usage_kb)
                        output_csv.write(col1)
                        output_csv.write(", ")
                        output_csv.write(col2)
                        output_csv.write(", ")
                        output_csv.write(now)
                        output_csv.write("\n")

                        output_csv.close( )


#                       print 'average megabits received', current_rx_usage / 60
#                       print 'average kilobits received', (current_rx_usage * 1024) / 60
#                       print 'average megabits sent', current_tx_usage / 60
#                       print 'average kilobits sent', (current_tx_usage * 1024) / 60


                        time.sleep(60)

        except Exception, e:
            raise


app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()
于 2012-05-23T04:53:16.520 に答える