我有一个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一样超时?实际的脚本可以运行很长时间(大约半小时,上限几个小时)所以我真的不想设置一个整体超时。检测到连接消失不应该花费几分钟的时间。