【问题标题】:rails Rake and mysql ssh port forwardingrails Rake 和 mysql ssh 端口转发
【发布时间】:2009-12-17 09:33:16
【问题描述】:

我需要创建一个 rake 任务来通过 ssh 隧道进行一些活动记录操作。

rake 任务在远程 Windows 机器上运行,所以我想把东西保存在 ruby​​ 中。这是我最近的尝试。

  desc "Syncronizes the tablets DB with the Server"
      task(:sync => :environment) do
        require 'rubygems'
        require 'net/ssh'

        begin
        Thread.abort_on_exception = true
        tunnel_thread = Thread.new do
          Thread.current[:ready] = false
          hostname = 'host'
          username = 'tunneluser'

          Net::SSH.start(hostname, username) do|ssh|
            ssh.forward.local(3333, "mysqlhost.com", 3306)
              Thread.current[:ready] = true
              puts "ready thread"
              ssh.loop(0) { true }
        end
        end

        until tunnel_thread[:ready] == true do
        end
        puts "tunnel ready"
        Importer.sync

        rescue StandardError => e    
          puts "The Database Sync Failed."
        end
  end

任务似乎挂在“隧道就绪”状态并且从未尝试同步。

首先运行 rake 任务以创建隧道,然后在不同的终端中运行 rake 同步时,我取得了成功。但是,我想将这些组合起来,这样如果隧道出现错误,它就不会尝试同步。

这是我第一次使用 ruby​​ Threads 和 Net::SSH 转发,所以我不确定这里有什么问题。

有什么想法吗!?

谢谢

【问题讨论】:

    标签: ruby-on-rails multithreading ssh rake portforwarding


    【解决方案1】:

    问题很可能与此处相同:

    Cannot connect to remote db using ssh tunnel and activerecord

    不要使用线程,你需要在另一个进程中 fork 导入器才能工作,否则你会被 ssh 事件循环锁定。

    【讨论】:

      【解决方案2】:

      仅将代码本身作为 ruby​​ 脚本运行(禁用 Importer.sync)似乎没有任何错误。这向我表明问题出在 Import.sync 上。您可以粘贴 Import.sync 代码吗?

      【讨论】:

      • 导入同步代码太多,这里就不贴了,但基本上是对这个的修改=>openmonkey.com/articles/2009/05/importing-legacy-data-in-rails。修改是它还更新记录以及导入它们。它使用两组模型,一组用于本地遗留数据库,一组用于服务器上的数据库(通过隧道)。
      • 好的,应该可以了。我认为下一步是运行脚本/控制台并手动执行命令。如果您正在运行 Unix,您还可以尝试在另一个窗口中窥探该接口,以查看是否有任何类型的流量。类似于: snoop -i lo port 3333 或 tcpdump -i interface name port 3333 当然,我可能有错误的命令 - 检查手册页。如果这没有帮助,请尝试查看是否可以通过该端口进行手动查询而不是运行同步。希望这不是某种延迟(尽管我认为您会更早看到运行这些任务)。
      【解决方案3】:

      只是一个猜测,但这里的问题可能是您的 :sync rake 任务将 rails 环境作为先决条件吗?在您的 Importer 类初始化中是否发生了任何需要依赖此 SSH 连接在加载时可用才能正常工作的事情?

      我想知道如果您尝试将环境作为此任务的先决条件而不是先决条件会发生什么...

      ...
      Rake::Task["environment"].execute
      Importer.sync
      ...
      

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 2018-10-24
        • 2012-03-20
        • 2021-07-01
        • 1970-01-01
        相关资源
        最近更新 更多