如何在resque工作程序中运行bash命令并处理其输出?

时间:2013-01-16 00:23:01

标签: ruby-on-rails ruby ruby-on-rails-3.2 resque ruby-1.9.3

我有一个resque worker,它在运行bash命令后立即停止所有处理。这是我的工作人员:

class ProductJsonSaver
  @queue = :products

  def self.perform(id)
    product = Product.find(id)
    json = `phantomjs #{Rails.root}/lib/product_scrape.js`
    product_json = JSON.parse(json)
    p "Procesing is done"
    p "Product JSON: #{product_json}"
    product.update_attributes({:processed => true})
  end
end

如果我跑

Resque.enqueue(ProductJsonSaver, 1)

我可以看到worker运行bash命令,我看到了bash命令的输出,但之后没有看到print语句没有产品的处理属性更新。 resque-web也不会将进程显示为失败。实际上,只需从rails控制台运行ProductJsonSaver.perform(1)即可。

这是Resque的错误吗?

坚果&螺栓:Rails 3.2.11,OSX,ruby-1.9.3,resque 1.23.0

已编辑代码,以使问题更加清晰。

2 个答案:

答案 0 :(得分:1)

原始代码是实际保存数据还是只是正确地放置“处理已完成”字符串?

你的专栏:

json = `cat #{Rails.root}/data/#{id}.json`

实际上并没有做任何事情。就像在最后一行中一样,你只是传递了你在第一行中获取的产品。另外,为什么要在最后一行设置一个变量,而不是允许从你在Product上调用的类方法中自然返回。

你也应该像这样阅读文件......

# in top of class 
require 'file' 

# in resque process method
File.open("#{Rails.root}/data/#{@id}.json", 'r') {|f| f.read}

或者通过将其包装在

中自动将其解析为JSON对象
 # in top of class 
 require 'json'  
 # in resque process method
 JSON.parse(File.open("#{Rails.root}/data/#{@id}.json", 'r') {|f| f.read})

希望这有帮助!

答案 1 :(得分:0)

抱歉是误报。也许这有助于其他人。我有较旧的resque工作者没有退出,但有一个较旧的代码库运行。因此,每次我排队工作时,年长的工人都会接受并开始工作。

  

$ ps -ef | grep [r] esque

并杀死-9来救援!