背后的故事:
用 ruby 1.8.6 编写的旧脚本,它打开到 ftp 的连接并下载配置文件。对于具有 windows ftp 服务器的特定客户端,脚本会挂起。日志在打开与 ftp 的连接后停止写入。 这是一个旧脚本,它是用 ruby 编写的,我不是这方面的专家。
我尝试了什么:
所以我尝试了这个超时实现来检查 ftp 连接是否挂断了这段代码
Timeout::timeout(5) {
ftp = Net::FTP.new(host,pass,host)
}
问题是这不起作用。我的猜测是解释器在打开连接时停止并且超时不会终止连接,因为解释器被卡住了。
这可能是问题所在吗?
你能告诉我是否有替代解决方案或者我做错了什么吗?
更多相关信息:
这个问题在一个月内偶尔会发生一次。最多喜欢两次。客户端向我们发送了 ftp 服务器日志,但在那一侧似乎没有任何问题。只是FTP根本无缘无故卡在那里...
最佳答案
我不确定它是否会无限期挂起。如果没有,最好的方法是在/如果最终超时时 try catch 错误代码。这将为分析提供更多信息。
下面是一些可能的解决方法。
使用 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
实现的限制。
关于ruby - 如何给 FTP 连接超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988433/