人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Ruby の Net::Telnet に関しての質問(再び)です。
以前こちらで http://q.hatena.ne.jp/1259121296 で質問させていただいた者です。
telnetできなかった時の処理はbegin/rescueでのエラーハンドリング処理で成功したのですが、telnetした後、その機器からping を実行し、ping できなかった場合、
/usr/lib/ruby/1.8/net/telnet.rb:557:in `waitfor': timed out while waiting for more data (Timeout::Error)
from /usr/lib/ruby/1.8/net/telnet.rb:692:in `cmd'
from telnet-ping-Alaxala-error-hatena.rb:12
というようなエラーでプログラムが止まってしまいます。pingできなかった時の処理はどのように書けばいいでしょうか?

begin/rescueでいろいろ試してみましたができませんでした。
telnetする対象機器は、Alaxalaのスイッチ3640です。
ちなみにCenterCOMのスイッチは、pingが失敗しても、止まることはありませんでした。

現在のコードは
targetIP = " ping できないIP"
telnet = Net::Telnet.new("Host" => "スイッチのIP")
telnet.login("ログイン名", "パスワード")
telnet.cmd("ping " + targetIP + " count 5"){|c| print c} # ping回数5
telnet.cmd("exit")
telnet.close
是非ともよろしくお願い致します。

●質問者: RESTfulJapan
●カテゴリ:コンピュータ インターネット
✍キーワード:.new BEGIN EXIT Hatena IP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● JULY
●13ポイント

Timeout::Errorに注意 - dreammindの日記

Timeout::Error は指定しないとキャッチできないようです。

◎質問者からの返答

ありがとうございます。


2 ● azuco1975
●7ポイント

http://www.mapee.jp/ruby/post_18.html

◎質問者からの返答

ありがとうございます。


3 ● mattn
●60ポイント ベストアンサー

Errno::TIMEOUTもハンドリングしたいのであれば

begin
 telnet = Net::Telnet.new("Host" => "192.168.1.1") {|c| print c}
 telnet.login("username", "password") {|c| print c}
 telnet.cmd("ping " + targetIP + " count 5"){|c| print c} # ping回数5
 telnet.cmd("exit") 
 telnet.close
rescue Errno::ECONNREFUSED
 # ここで接続失敗の処理
rescue Errno::TIMEOUT
 # ここでコマンド実行失敗の処理
rescue
 # その他のエラーの処理
end

とすればエラーでrubyプログラムが止まる事は無くなります。

ただ気をつけなければならないのが、このエラーがpingの結果のタイムアウトではなく、telnetでコマンドを実行しようとしてタイムアウトしているという事です。

これが頻繁に発生している様であれば、環境を疑った方がよいかもしれません。ping自身は定期間隔で出力がありますので、タイムアウトする可能性があるとすればおそらくホスト名の解決に失敗している可能性があります。

◎質問者からの返答

これでできたと思われます。

丁寧にありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ