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

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

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営業担当【hsd-sales@atomitech.jp】までご連絡ください。

※お問い合わせフォームからご連絡の場合には、お問い合わせ内容で「Hinemosについて」を選択し、
 本文の冒頭に「Hinemos研究日記_【タイトル名】」とご記載ください。
※メールアドレスへご連絡の場合には、件名を「Hinemos研究日記_【タイトル名】」でご連絡ください。