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
是非ともよろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/11/30 18:01:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:mattn No.3

回答回数104ベストアンサー獲得回数23

ポイント60pt

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自身は定期間隔で出力がありますので、タイムアウトする可能性があるとすればおそらくホスト名の解決に失敗している可能性があります。

id:RESTfulJapan

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

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

2009/11/30 18:01:03

その他の回答2件)

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント13pt

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

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

id:RESTfulJapan

ありがとうございます。

2009/11/30 18:00:34
id:azuco1975 No.2

回答回数613ベストアンサー獲得回数16

id:RESTfulJapan

ありがとうございます。

2009/11/30 18:00:36
id:mattn No.3

回答回数104ベストアンサー獲得回数23ここでベストアンサー

ポイント60pt

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自身は定期間隔で出力がありますので、タイムアウトする可能性があるとすればおそらくホスト名の解決に失敗している可能性があります。

id:RESTfulJapan

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

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

2009/11/30 18:01:03

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません