PythonをつかったPing値の取得

最終更新日 2024/11/17 

 ※注意

Linuxサーバーであることを前提として文章を書いています。 

Pingとは?

ネットワークの通信の応答速度を表す数値や、ネットワークの疎通確認を行うコマンドのことです


Ping値が低いと通信環境はよく、Ping値が高いと通信環境が悪いということになります
例えば応用編(3)を用いた方法でbotがエラーをはいているのかサーバーがエラーをはいているのかを一目で見分けることができます。
それだったりメインのサーバーからサブサーバーの監視を常に行ったり用途は様々...

pingを取得しよう

まずは、必要なモジュールを入れてください。
            
              pip install subprocess
              pip install re
            
            
これでモジュールのインストールは完了です。 つぎに、pythonでコーディングしていきます。
            
              import subprocess
import re

def ping_address():

    address = input("Pingしたいアドレスを入力してください: ")
    
    if not address:
        print("アドレスが入力されていません。終了します。")
        return
    
    try:
  
        command = ["ping", "-c", "1", address]  # -cでは回数を指定しています。(例)"-c","5"だと5回pingを送信します。

        result = subprocess.run(
            command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
        )
        
  
        if result.returncode == 0:
 
            match = re.search(r"time[=<](\d+\.?\d*) ?ms", result.stdout)
            if match:
                response_time = match.group(1)
                print(f"{address} の応答時間: {response_time} ms")
            else:
                print(f"{address} にPingできましたが、応答時間が取得できませんでした。")
        else:
            print(f"{address} にPingできませんでした。\nエラー: {result.stderr}")
    
    except Exception as e:
        print(f"エラーが発生しました: {e}")


ping_address()

            
          
これでpythonのコードは終了です。残りは実行のみです
            
              python3 main.py
            
          

応用編(2)

これだと1回しか出力されません。無限に送信するコードを作ってみましょう
注意:pingを常時送信することによって通信帯域が狭まる可能性があります。自己責任で実行してください。
              
                import time
                
            
              

import subprocess
import re
import time

def ping_address():

    address = input("Pingしたいアドレスを入力してください: ")
    
    if not address:
        print("アドレスが入力されていません。終了します。")
        return
    
    print(f"{address} に対して0.5秒ごとにPingを送ります。終了するには Ctrl+C を押してください。\n")
    
    try:
        while True:

            command = ["ping", "-c", "1", address] 

            # command = ["ping", "-n", "1", address]

          
            result = subprocess.run(
                command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
            )
            
        
            if result.returncode == 0:
               
                match = re.search(r"time[=<](\d+\.?\d*) ?ms", result.stdout)
                if match:
                    response_time = match.group(1)
                    print(f"{address} の応答時間: {response_time} ms")
                else:
                    print(f"{address} にPingできましたが、応答時間が取得できませんでした。")
            else:
                print(f"{address} にPingできませんでした。\nエラー: {result.stderr}")
            
            # 0.5秒待機
            time.sleep(0.5)
    
    except KeyboardInterrupt:
        print("\nPingを終了します。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")


if __name__ == "__main__":
    ping_address()

              
            
ここでは0.5秒間隔で無限に送信しています。早くしたかったり遅くしたい場合は、time.sleep(0.5)を変更してください。 sleepの引数は秒単位なので 1分起きだったら(60)としてください。sleepの引数を分単位にする奴は忘れました。