1

ssh トンネルを介してアクティブなレコード操作を実行するには、rake タスクを作成する必要があります。

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 syncを別のターミナルで実行すると成功しました。ただし、これらを組み合わせて、トンネルにエラーが発生した場合に同期を試行しないようにしたいと考えています。

ruby Threads と Net::SSH 転送を使用するのはこれが初めてなので、ここで何が問題なのかわかりません。

何か案は!?

ありがとう

4

3 に答える 3

2

この問題は、次の場合と同じである可能性が非常に高いです。

ssh トンネルとアクティブ レコードを使用してリモート データベースに接続できない

スレッドを使用しないでください。インポーターを機能させるには、別のプロセスでインポーターをフォークする必要があります。そうしないと、ssh イベント ループでロックアップします。

于 2011-03-12T12:00:22.570 に答える
0

推測ですが、ここでの問題は、:sync rake タスクの前提条件として rails 環境があることでしょうか? Importer クラスの初期化で、この SSH 接続が正しく機能するためにロード時に利用可能であることに依存する何かが起こっていますか?

環境をこのタスクの前提条件にする代わりに、試してみたらどうなるでしょうか...

...
Rake::Task["environment"].execute
Importer.sync
...
于 2009-12-31T19:39:00.757 に答える
0

コード自体を ruby​​ スクリプトとして (Importer.sync を無効にして) 実行するだけで、エラーなしで動作するようです。これは、問題が Import.sync にあることを示唆しています。Import.sync コードを貼り付けていただけませんか?

于 2009-12-26T03:21:28.520 に答える