【问题标题】:How do I run a bash command and process its output in a resque worker?如何运行 bash 命令并在 resque worker 中处理其输出?
【发布时间】:2013-01-16 00:23:01
【问题描述】:

我有一个 resque 工作者,它在运行 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)

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

这是 Resque 的错误吗?

基本要素:Rails 3.2.11、OSX、ruby-1.9.3、resque 1.23.0

EDITED 代码使问题更清晰。

【问题讨论】:

  • 您实际上没有使用“json”变量是否有原因?我看到您正在将“prod”传递给您的#save_from_json
  • 更新了代码,```里面的命令运行后基本什么都没有了。

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


【解决方案1】:

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

您的线路:

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

实际上并没有做任何事情。与最后一行一样,您只是将您在第一行中获取的 Product 传递给它。另外,为什么要在最后一行设置一个变量,而不是允许从您在 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})

希望这会有所帮助!

【讨论】:

  • 感谢详细的答案,但 cat 命令只是一个示例。基本上需要一种从 bash 命令中使用标准输出并在我的工作人员中使用它的方法。
  • “您的标准输出”与从 Ruby 读取文件有何不同?
【解决方案2】:

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

$ ps -ef | grep [r] 风格

然后杀死 -9 来救援!

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2011-02-02
    • 2019-01-24
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多