1

背后的故事:

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

我尝试了什么:

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

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

问题是这行不通。我的猜测是解释器在打开连接时停止,并且超时不会终止连接,因为解释器被卡住了。

这可能是问题所在吗?

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

有关它的更多信息:

这个问题在一个月内偶尔会发生一次。最多喜欢两次。客户端向我们发送了 ftp 服务器日志,但那方面似乎没有任何问题。只是FTP根本无缘无故挂在那里......

4

1 回答 1

3

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

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

超时使用Process.fork

但是,与此同时,您可能会切换到在另一个进程中运行 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.8Timeout实现的限制。

于 2012-06-12T12:54:18.597 回答