рельсы рэйк и mysql пересылка ssh портов - PullRequest
1 голос
/ 17 декабря 2009

Мне нужно создать грабли для выполнения некоторых активных операций записи через туннель ssh.

Задача rake запускается на удаленной машине с Windows, поэтому я хотел бы сохранить все в рубине. Это моя последняя попытка.

  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 в другом терминале. Однако я хочу объединить их, чтобы в случае ошибки с туннелем он не пытался выполнить синхронизацию.

Я впервые использую рубиновые потоки и переадресацию Net :: SSH, поэтому я не уверен, в чем здесь проблема.

Любые идеи!?

Спасибо

Ответы [ 3 ]

2 голосов
/ 12 марта 2011

Скорее всего, проблема такая же, как здесь:

Невозможно подключиться к удаленной базе данных, используя туннель ssh и activerecord

Не используйте потоки, вам нужно отключить импортер в другом процессе, чтобы он работал, иначе вы заблокируетесь с помощью цикла событий ssh.

0 голосов
/ 31 декабря 2009

Просто предположение, но может ли проблема заключаться в том, что ваша задача: sync rake имеет предварительное условие среды rails? Что-нибудь происходит в вашей инициализации класса Importer, которая будет полагаться на доступность этого SSH-соединения во время загрузки для правильной работы?

Интересно, что произойдет, если вместо того, чтобы окружение было предпосылкой для этой задачи, вы попытались ...

...
Rake::Task["environment"].execute
Importer.sync
...
0 голосов
/ 26 декабря 2009

Просто запуск самого кода в виде сценария ruby ​​(с отключенным Importer.sync) работает без ошибок. Это подсказало бы мне, что проблема связана с Import.sync. Можно ли вставить код Import.sync?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...