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の引数を分単位にする奴は忘れました。