【问题标题】:Rails - running delayed_job on sh scriptRails - 在 sh 脚本上运行延迟作业
【发布时间】:2016-09-01 04:50:19
【问题描述】:

我在 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

【问题讨论】:

  • 虽然不是一个好的解决方案,但您可以使用& 并在后台运行该处理。 @jobCall = 'sh /home/some.user/kitchen.sh &' 最后通知&

标签: ruby-on-rails delayed-job


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不熟悉 Ruby/Rails,但仅仅调用 system() 不会做你想做的事,因为 system() 不使用 delay_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()
    

    ...应该可以解决问题。

    【讨论】:

    • 对,这就是问题所在......我将在哪里链接 .delay ?我在 '@job.delay.save' 上尝试过,但出错了:(
    • 据我了解文档应该链接到最终执行 shell 脚本的任何方法。请参阅上面的编辑。
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 2012-11-05
    • 1970-01-01
    • 2012-09-14
    • 2013-02-18
    • 2013-05-28
    • 2011-02-12
    • 2012-07-15
    相关资源
    最近更新 更多