Rails - 在sh脚本上运行delayed_job

时间:2016-08-31 20:32:45

标签: ruby-on-rails delayed-job

我在Unicorn上运行Rails 4.2。

我需要从我的应用程序调用sh脚本,但是我需要我的控制器来调用SH脚本而不是等待SH脚本运行。

我目前使用system(@jobCall)

调用sh脚本

为此,我安装了delayed_job gem。如何在不等待工作完成的情况下运行system(@jobCall)

完整创建方法代码如下:

  def create
    @job = Job.new(job_params)

    respond_to do |format|
      if @job.save

        @jobCall = 'sh /home/some.user/kitchen.sh'
        system(@jobCall) ##need to call this and not wait for job to finish

        format.html { redirect_to @job, notice: 'Job ran'}
        format.json { render :show, status: :created, location: @job }
      else
        format.html { render :new }
        format.json { render json: @job.errors, status: :unprocessable_entity }
      end
    end
  end

2 个答案:

答案 0 :(得分:1)

我认为你需要的是在后台运行工作using threads。虽然,您可能想要另一种获取作业结果的方法,但如果您不需要等待它完成,则不需要渲染或重定向。

答案 1 :(得分:0)

我不熟悉Ruby / Rails,但只是调用system()不会做你想要的,因为system()不使用delayed_job gem。看看documentation for delayed_job

基本概念是这样的:

  

排队工作

     

在任何对象上调用.delay.method(params),它将在后台处理。

# without delayed_job
@user.activate!(@device)

# with delayed_job
@user.delay.activate!(@device)

修改 不确定这是否有效(因为我缺乏Ruby on Rails的经验),但它应该是这样的:

class Foo
  def sh_script
    system('sh /home/some.user/kitchen.sh')
  end
  handle_asynchronously :sh_script, :priority => 20
end

然后

@f = new Foo.new()
@f.delay.sh_script()

......应该这样做。