ruby - 如何给 FTP 连接超时

标签 ruby ftp

背后的故事:

用 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/

相关文章:

ruby-on-rails - GraphQL/Rails 422 无法处理的实体 - 将 token 保存到 session

mysql - 如何在 ruby​​ on rails 中实现递归删除?

ruby - 是否有易于使用的 Ruby FTP 库?

java - 应该检索公共(public)FTPClient的文件从远程服务器删除文件

通过 FTP 上传 PHP - ftp_put() 我不会打开到 x.x.x.x 的连接(仅到 y.y.y.y)

ruby-on-rails - Bundler 将我的 gem 放在我的项目目录中

ruby-on-rails - 如何将所有 shopify 过滤器添加到标准液体中

ruby - 如何将数组元素放入 HTML 表格中?

bash - 使用单个 session 在 shell/bash 中递归 FTP 目录列表(使用 cURL 或 ftp)

linux - 两个具有相同路径权限的 FTP 用户