以前こちらで 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
是非ともよろしくお願い致します。
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自身は定期間隔で出力がありますので、タイムアウトする可能性があるとすればおそらくホスト名の解決に失敗している可能性があります。
ありがとうございます。
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自身は定期間隔で出力がありますので、タイムアウトする可能性があるとすればおそらくホスト名の解決に失敗している可能性があります。
これでできたと思われます。
丁寧にありがとうございました。
これでできたと思われます。
丁寧にありがとうございました。