如何让Ruby Net :: SSH在网络问题上正常失败?

时间:2014-08-19 14:07:29

标签: ruby net-ssh

我有一个ruby脚本,它使用Net :: SSH在远程主机上执行某些操作。它主要运行良好,适当地报告错误,但有时只是挂起。我确定它似乎与重新启动远程主机(Linux主机)上的网络和sshd有关。

我写了一个简化的脚本来演示这个问题:

#!/usr/bin/env ruby
# ruby is 1.9.3, Net::SSH::Version::STRING = "2.8.0" 
require 'net/ssh'

user, host = ARGV

puts "Connecting to #{user}@#{host}"

ssh = Net::SSH.start(host, user, { :auth_methods => ['publickey'], :timeout => 10, :verbose =>  :debug})
ssh.open_channel do |channel|
  channel.exec("sleep 10") do |ch,success|
    abort "failed" unless success
    channel.on_data {|ch,data| puts "stdout: #{data}" }
    channel.on_extended_data {|ch,type,data| puts "stderr: #{data}" }
    channel.on_close {|ch| puts "channel is closing" }
  end
end
ssh.loop

如果我然后单独ssh到主机,并且在运行时,我停止网络(service network stop),独立的ssh会话最终会超时(Timeout, server x.x.x.x not responding.)但是这个脚本永远不会出口。杀死网络后没有调试输出。

由于很多原因,网络可能会在没有通知的情况下死亡,因此这是一个问题。有没有什么我应该做的让它像常规ssh一样超时?实际的脚本可以运行很长时间(大约半小时,上限几个小时)所以我真的不想设置一个整体超时。检测到连接消失不应该花费几分钟的时间。

0 个答案:

没有答案