背后的故事:
用ruby 1.8.6编写的旧脚本打开与ftp的连接并下载配置文件。对于具有Windows ftp服务器的特定客户端,脚本只会挂起。在打开与ftp的连接后,日志停止写入。 这是一个古老的剧本,它是红宝石,我不是它的专家。
我尝试了什么:
所以我尝试了这个超时的实现来检查ftp连接是否与此代码挂起
Timeout::timeout(5) {
ftp = Net::FTP.new(host,pass,host)
}
问题是这不起作用。我的猜测是解释器在打开连接时停止,超时不会终止连接,因为解释器卡住了。
这可能是问题所在吗?
你能否告诉我是否有替代解决方案,或者我做错了什么?
有关它的更多信息:
这个问题在一个月内偶尔发生一次。最多两次。客户端向我们发送了ftp服务器日志,但这方面似乎没有任何错误。这只是FTP毫无理由地挂在那里......
答案 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
实现的限制。