5

最近我正在调整我的 rails 应用程序以在 JRuby 上运行。我遇到的问题之一是回形针。Paperclip 使用 Cocaine 来运行像 ImageMagick 这样的命令行工具,它使用 Process.spawn,结果是:

Errno::ECHILD:没有子进程 - 没有子进程
                 waitpid 在 org/jruby/RubyProcess.java:512
                 waitpid 在 org/jruby/RubyProcess.java:497
                 waitpid 在 /home/cthulhu/.rvm/gems/jruby-1.6.7.2/gems/cocaine-0.3.0/lib/cocaine/command_line/runners/process_runner.rb:21
                    致电/home/cthulhu/.rvm/gems/jruby-1.6.7.2/gems/cocaine-0.3.0/lib/cocaine/command_line/runners/process_runner.rb:9
                 在 /home/cthulhu/.rvm/gems/jruby-1.6.7.2/gems/cocaine-0.3.0/lib/cocaine/command_line.rb:77 执行
                     在 /home/cthulhu/.rvm/gems/jruby-1.6.7.2/gems/cocaine-0.3.0/lib/cocaine/command_line.rb:55 运行
                     在 /home/cthulhu/.rvm/gems/jruby-1.6.7.2/gems/paperclip-3.2.0/lib/paperclip/helpers.rb:29 运行

有什么方法可以让 Paperclip 与 JRuby 一起顺利工作?我只在 linux 上运行我的应用程序,所以我不介意使用像 ImageMagick 这样的 linux 原生工具。

导轨 3.2.8,JRuby 1.6.7.2

4

3 回答 3

6

这在 JRuby 1.7 中仍然是一个问题。Cocaine Github 页面上有一个关于 JRuby的警告,将其定义为 JRuby 问题。对我来说,在撰写本文时,让它工作的唯一方法是使用

Cocaine::CommandLine.runner = Cocaine::CommandLine::BackticksRunner.new

如 Cocaine Github 页面的Runners部分所述。

于 2012-10-30T03:01:14.960 回答
2

在对 Paperclip 和 Cocaine 代码进行了一些挖掘之后,我编写了一个初始化程序,它在 JRuby 上对Cocaine 进行猴子补丁以使用BackticksRunner

if RUBY_PLATFORM == 'java'
  module Cocaine
    class CommandLine
      def best_runner
        BackticksRunner.new
      end
    end
  end
end

但是,我仍在寻找更清洁的解决方案。

于 2012-09-12T11:43:41.047 回答
2

FWIW,我刚刚向 Cocaine 大师推送了一个允许您手动覆盖 Runner 的访问器。

Cocaine::CommandLine.runner = Cocaine::CommandLine::BackticksRunner.new

我不知道为什么 jruby 报告 Process.spawn 可用时它不可用,但至少我们有一个解决方法。

于 2012-09-12T13:54:52.153 回答