Ubuntu 8.04.2 の Ruby で capistrano が動かない場合の対処

p368 で Net::SSH が刺さるという問題 https://capistrano.lighthouseapp.com/projects/8716/tickets/79-capistrano-hangs-on-shell-command-for-many-computers-on-ruby-186-p368 があって,それは Ruby 側で解決 http://redmine.ruby-lang.org/issues/show/1848 されたのですが,どうも Net::SSH 側でもなにかしら変更があったようで 2.0.14 が リリース されました.

とここまではいいのですが,Ubuntu 8.04.2 の Ruby は 1.8.6-p111 で,これだと刺さる現象が再現してしまいます.何が問題かはわかりませんが,2.0.13 だと刺さらないことから,下記の部分じゃないかと想像できます.

module Net; module SSH

  # This class contains miscellaneous patches and workarounds
  # for different ruby implementations.
  class Compat

    # A workaround for an IO#select threading bug in MRI 1.8.
    # See: http://net-ssh.lighthouseapp.com/projects/36253/tickets/1-ioselect-threading-bug-in-ruby-18
    # Also: http://redmine.ruby-lang.org/issues/show/1993
    if RUBY_VERSION >= '1.9' || RUBY_PLATFORM == 'java'
      def self.io_select(*params)
        IO.select(*params)
      end
    else
      SELECT_MUTEX = Mutex.new
      def self.io_select(*params)
        SELECT_MUTEX.synchronize do
          IO.select(*params)
        end
      end
    end

  end

end; end

Mutex Lock しているんですが,これがなにか悪さしているようです.ちゃんと調べてないのであれですが,もし同様の問題ではまってる方はバージョンダウンしてみてください.

##追記 Ruby Enterprise Editionでも刺さりました.バージョンは以下のもの.

% ruby -v
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux]
Ruby Enterprise Edition 20090610
 
comments powered by Disqus