【Python】pingでサーバーの死活監視を行う(subprocessモジュール)
2020.09.17 /
みなさんping使っていますか?
私は日々の業務で使わない日はない!と言えるくらい毎日使っています。
主な用途としては、各機器(サーバーやNAS、ルーターなど)がきちんと動いているかの確認で使用しています。
いわゆる死活監視ですね。
ほかには社員のパソコンがインターネットにつながらないといった場合やインターネット速度が遅いといったときにもpingコマンドを使いますね。
例えばインターネットにつながっているかどうかを確認したいときは、コマンドプロンプトを起動して、ping 8.8.8.8 -tと打ち込み実行します。
これはなにをしているかというと、8.8.8.8(GoogleのパブリックDNS)のアドレスに対して、疎通が取れているかの確認をしています。
ちょっと今回の記事内容から話が脱線してしまいましたが、本記事ではPythonによるpingコマンドでのサーバー死活監視について解説していきます。
サーバーやその他機器の死活監視は、社内SEだけでなく、IT業務にかかわる多くの方に関係する話だと思います。
本記事の対象者
本記事は以下に該当する方向けの内容となっています。
該当していなくても、興味があれば読んでください。
Python学習者(初級~中級者)
社内機器の保守・管理者
Pingによる死活監視を自動化したい人
自作でPythonによるプログラムを作りたい人
subprocessモジュールを使用
Pythonの標準モジュールであるsubprocessを使用してpingコマンドを実行します。
subprocess.runによってOSのpingコマンドを呼び出して使用します。
subprocessモジュールについては、以下記事に詳しい使い方を記載しているので、よく知らない方は、ぜひご確認ください。
【Python】subprocess.Popen()関数で他のプログラムを起動する
サンプルプログラム
以下にsubprocessモジュールを使用した、ping死活監視プログラムを記します。
import subprocess
from ctypes import windll
hosts = ["192.168.0.100", "192.168.0.101", “192.168.0.54”]
while True:
for host in hosts:
result = subprocess.run(["ping.exe", host, "-n", "1"], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
num = result.returncode
if num == 1:
user32 = windll.user32
user32.MessageBoxW(0, "error", host, 0x00000040)
break
if num == 1:
break
サンプルプログラムをコピペして、hostsには同じネットワーク内の機器IPアドレスを入れて起動してみてください。
機器が正常動作し続けているならば、エラーは表示されずにプログラムを止めるまでpingを出し続けます。
pingによる疎通が行われなかった場合、以下のようにエラー画面が表示され、プログラム自体がストップします。
エラーの判定について
pingを対象機器に送信してそれらが動作しているかどうかの判定は、pingの返り値で行います。
サンプルプログラムではresult.returncodeで得た値をnumに代入しています。
umが0のとき、pingは正常終了していることを表し、1であればエラーが発生していることを表します。
*pingでタイムアウトエラーが発生した場合に1が返ってきます
*「宛先ホストに到達できません」のエラーでは、正常終了の0が返ってくるため注意が必要です
エラーが発生している場合(num==1のとき)、メッセージボックスを表示してどのIPアドレスの機器が動作していないかわかります。
pypingでのping死活監視
今までは標準モジュールのsubprocessを使用したping死活監視の方法を説明してきました。
実はそのほかにpypingを用いたping送信の方法があります。
PYPI – pyping
使用方法は非常に簡単なのですが、私の場合、pypingを正常に使うことができませんでした。
今後正常動作が確認できましたら、この記事にアップします。
まとめ
サンプルプログラムの使い方としては、exeファイルにして、起動時に自動的に実行するような形にするといいかと思います。
他にもいろいろな使い方がありますので、ぜひ考えて新しいプログラム作りに挑戦してみてください。