如何为FTP连接提供超时

时间:2012-06-11 22:36:32

标签: ruby ftp

背后的故事:

用ruby 1.8.6编写的旧脚本打开与ftp的连接并下载配置文件。对于具有Windows ftp服务器的特定客户端,脚本只会挂起。在打开与ftp的连接后,日志停止写入。 这是一个古老的剧本,它是红宝石,我不是它的专家。

我尝试了什么:

所以我尝试了这个超时的实现来检查ftp连接是否与此代码挂起

Timeout::timeout(5) {
ftp = Net::FTP.new(host,pass,host)
}

问题是这不起作用。我的猜测是解释器在打开连接时停止,超时不会终止连接,因为解释器卡住了。

这可能是问题所在吗?

你能否告诉我是否有替代解决方案,或者我做错了什么?

有关它的更多信息:

这个问题在一个月内偶尔发生一次。最多两次。客户端向我们发送了ftp服务器日志,但这方面似乎没有任何错误。这只是FTP毫无理由地挂在那里......

1 个答案:

答案 0 :(得分:3)

我不确定它是否会无限期挂起。如果没有,最好的方法是在/最终超时时尝试捕获错误代码。这将为分析提供更多信息。

下面有一些可能的解决方法。

使用Process.fork

超时

但与此同时,您可能会切换到另一个process中运行FTP任务,并使用超时。这将阻止ruby全局解释器锁定禁用您现在怀疑的可能的超时事件。

这样的事情:

child = Process.fork do
  # Run the whole FTP task in here...
  ftp = Net::FTP.new(...)
  ...
end

# Timeout handling is done in the parent process
begin
  Timeout::timeout(...) do
    Process.wait(child)
  end 
rescue Timeout::Error
  # Terminate child in case of timeout
  Process.kill("KILL", child)
end

使用SystemTimer

超时

另一个选择是,因为你正在运行ruby 1.8.6,所以要看看SystemTimer,它试图克服ruby 1.8 Timeout实现的限制。