Pythonコードで他のマシンへの疎通確認する方法について
システム管理をしていると、他のマシンの死活監視をpingコマンドによって行いたいケースに出くわすことがあります。
このような場合、Pythonで作られたシステムからpingコマンドを使う場合に、subprocessを使ってOSのpingコマンドを呼び出す方法が一般的かと思います。
しかし、この場合、外部のコマンドを使うことになるため、外部の環境に依存したり、細かい制御が難しいという問題がありました。
そのため、今回はPythonの中で完結するようにsocketによる死活監視のためのライブラリを作成したので紹介します。
Pingsを使った死活監視
pingsはPythonでpingを送信するためのライブラリです。
上記の通り、pingに使われるICMPパケットをsubprocessコマンドを使わずに、socketを使って送る事ができます。
注意: pingsはroot/adminユーザーで実行する必要があります。
インストール
pip経由でインストールすることができます。
pip install pings
使い方
対象の死活の状態を監視したい場合は、以下のようにします。※実行時は必ずrootユーザ/adminユーザで動かすようにしてください。
-
Ping
オブジェクトを初期化 -
ping()
メソッドの引数に監視対象を指定- このメソッドは、対象にpingを飛ばし、戻り値として
response
オブジェクトを返す - このオブジェクトの
is_reached()
に疎通状態の結果が格納
- このメソッドは、対象にpingを飛ばし、戻り値として
具体的には、以下のようなコードになります。
import pings
p = pings.Ping() # Pingオブジェクト作成
res = p.ping("google.com") # googleを監視
if res.is_reached():
# 監視対象への接続ができた
do_something()
else:
# 監視対象への接続ができなかった
do_something()
pingメソッドの返り値として得られるresponse
オブジェクトを使うことでネットワークの状態などの監視に役立てることができます。
res = p.ping("google.com")
res.print_messages() # メッセージが表示される
実行結果の例:
PING google.com (172.217.27.174): 55 data bytes
47 bytes from 172.217.27.174: icmp_seq=0 ttl=49 time=32.333 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 32.333/32.333/32.333 ms
より細かい設定
複数の対象の死活監視をしたい
複数台のマシンを死活監視する場合は以下のようにします。
import pings
# 死活監視のマシンのIPアドレス
hosts = ["192.168.0.1", "192.168.0.2", "192.168.0.3"]
p = pings.Ping()
# マシンのIPアドレスを一つずつ取り出してpingコマンドを実行
for h in hosts:
res = p.ping(h)
if not res.is_reached():
# 接続ができなかった場合の処理
do_something()
pingを複数回飛ばしたい
デフォルトの設定の場合、pingを飛ばす回数が1回のみとなるため、複数回送信したい場合は times
オプションを使用します。
import pings
p = pings.Ping()
res = p.ping("google.com", times=3) # googleを監視, 3回pingを飛ばす
res.print_messages()
実行結果の例:
PING google.com (172.217.27.174): 55 data bytes
47 bytes from 172.217.27.174: icmp_seq=0 ttl=49 time=32.333 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 32.333/32.333/32.333 ms
標準出力に結果を出力したい
Pingクラスの初期化時にquiet
オプションをFalse
に指定することで、実行中に標準出力にpingの結果が表示されます。
import pings
p = pings.Ping(quiet=False)
res = p.ping("google.com") # googleを監視
実行結果の例:
PING google.com (172.217.27.174): 55 data bytes
47 bytes from 172.217.27.174: icmp_seq=0 ttl=49 time=32.333 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max = 32.333/32.333/32.333 ms
おわりに
まだテストが不十分のため、環境によっては動かなかったり、うまく処理されないなどの問題がある可能性があります。
使われる場合は、そのことを認識していただいてから使用するようにしてください。
問題やコメントがありましたら、コメント欄やGithubのissueに書いていただけたらと思います。
参考