【Perl】fpingをPerlで実装してみる(その1)

投稿日: / 更新日:

この記事は2年以上前に書かれたものです。情報が古い可能性があります。

AnyEventという、非同期のイベント駆動プログラミングができるCPANモジュールがあります。Perl界隈ではもう何年も前からよく話題に上っていたのですが、私はこれまで全く使った事がなかったので、練習がてらこのモジュールを使用して、fping的なプログラムを実装してみました。

以下はサンプルコードです。

実は、AnyEventを使用してfpingを実装するためにおあつらえ向きのAnyEvent::FastPingというCPANモジュールが既にあったので、今回はこちらを使わせて頂きました(こちらも、AnyEventと同じ著者のモジュールです)。おかげで、約60行と非常に短いコード量で実装することができました(反面、あまりAnyEventの勉強にならなかったのが心残りですが…)。

コードの方ですが、AnyEventではイベント駆動のためのコールバック関数をあらかじめ登録しておく必要があります。今回は、on_recv(pingの応答を受信した時)とon_idle(全てのホストへpingを送信し、あらかじめ設定した時間が経過した時)という2つのイベントに対して、それぞれ無名サブルーチンのリファレンスを割り当てています。前者ではping応答の結果をホスト名をキーとしたハッシュへ格納し、後者ではping送信が指定回数に達したかどうかを判定し、結果の出力またはpingの再実行を行います。

なお、コマンドラインオプションは”-C”(ping回数)と”-p”(間隔)しか実装していませんが、基本的にはHinemosに同梱されているfpingコマンドと同様の使い方ができます。なおfpingと異なり、”-p”オプションは今のところ、1回毎のpingのタイムアウトを兼ねています。

以下は使用例です。なお、ping送信間隔は1000msec(デフォルト)です。

Perlの場合、実行フェーズの前にコンパイルフェーズが走るため、その分少し時間が長くかかりますが、それでも全体で3秒少々しかかかっておらず、全てのホストに対して非同期にpingを送信していることが分かると思います。

ちなみに、Hinemosのfpingで同じ事をすると、以下のようになります。こちらも、ping送信間隔は1000msec(デフォルト)です。

ネイティブなのでさすがに速いです。また、CPUの使用時間もごく僅かです。総実行時間(real)が3秒を切っている理由は分かりませんが、実際に使用する分には恐らく問題はないと思います。

オプション指定時の挙動をもう少し本家fpingに近づけることができれば、Hinemosが使用するfpingをこちらに差し替える事もできると思います(運用上、ほとんど意味はないですが…)。

以上、簡単ですがPerlに関する話題をご紹介しました。

Hinemos導入はアトミテックにお任せください

見積もりを依頼する

最新情報発信中

Xやメルマガでも、Hinemosの保守、
開発、導入、構築やカスタマイズ等の
お役立ち情報を発信しています。
是非ご登録ください。