45
45

More than 5 years have passed since last update.

Pythonからpingで他のマシンの死活監視をするライブラリ

Last updated at Posted at 2017-09-01

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()に疎通状態の結果が格納

具体的には、以下のようなコードになります。

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に書いていただけたらと思います。

参考

45
45
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
45