2016-08-31 7 views
0

私はRails 4.2をUnicorn上で実行しています。Rails - shスクリプトでdelayed_jobを実行

私のアプリケーションからshスクリプトを呼び出す必要がありますが、私のコントローラはSHスクリプトを呼び出し、SHスクリプトが実行されるのを待つ必要はありません。

私は現在、私はdelayed_jobの宝石をインストールし、このためにsystem(@jobCall)

とshスクリプトを呼び出します。ジョブが完了するのを待たずにsystem(@jobCall)を実行するにはどうすればよいですか?

全下記の方法でコードを作成しますので、システム()、)私はルビー/ Railsのに慣れていないですが、ちょうど呼び出しシステム(

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 
+0

良い解決策ではありませんが、 '&'を使用してその処理をバックグラウンドで実行できます。 '@jobCall = 'sh /home/some.user/kitchen.sh&''最後に '&'を通知します。 – kiddorails

答えて

1

私は、あなたが必要とするものは、バックグラウンドでジョブを実行することだと思います。using threadsジョブの結果を取得する別の方法が必要な場合もありますが、レンダリングやリダイレクトは完了するまで待つ必要はありません。

+0

私のために。 – HoosierCoder

0

をあなたがやりたいことはありませんdelayed_jobの宝石を使用していません。 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() 

...このトリックを行う必要があります。

+0

そうですが、それは問題です.Delayをどこで連鎖すればいいですか?私は '@ job.delay.save'で試しましたが、それはエラーです:( – HoosierCoder

+0

ドキュメントを理解する限り、最終的にどのような方法でもシェルスクリプトを実行する必要があります。 – Striezel

関連する問題