Rails - 运行 delayed_job 在 sh 脚本上
Rails - running delayed_job on sh script
我在 Unicorn 上安装了 Rails 4.2 运行ning。
我需要从我的应用程序调用 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
我不熟悉 Ruby / Rails,但是仅仅调用 system() 不会做你想要的,因为 system() 不使用 delayed_job gem。看看 documentation for delayed_job.
基本概念是这样的:
Queuing Jobs
Call .delay.method(params) on any object and it will be processed in the background.
# without delayed_job
@user.activate!(@device)
# with delayed_job
@user.delay.activate!(@device)
编辑:
不确定这是否有效(因为我对 Rails 上的 Ruby 缺乏任何经验),但它应该是这样的:
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()
...应该可以解决问题。
我想你需要的是 运行 后台作业 using threads。虽然,如果您不需要等待它完成,您可能想要另一种获取作业结果的方式,而不是呈现或重定向。
我在 Unicorn 上安装了 Rails 4.2 运行ning。
我需要从我的应用程序调用 sh 脚本,但我需要我的控制器调用 SH 脚本而不是等待 SH 脚本 运行。
我目前使用 system(@jobCall)
为此我安装了 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
我不熟悉 Ruby / Rails,但是仅仅调用 system() 不会做你想要的,因为 system() 不使用 delayed_job gem。看看 documentation for delayed_job.
基本概念是这样的:
Queuing Jobs
Call .delay.method(params) on any object and it will be processed in the background.
# without delayed_job @user.activate!(@device) # with delayed_job @user.delay.activate!(@device)
编辑: 不确定这是否有效(因为我对 Rails 上的 Ruby 缺乏任何经验),但它应该是这样的:
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()
...应该可以解决问题。
我想你需要的是 运行 后台作业 using threads。虽然,如果您不需要等待它完成,您可能想要另一种获取作业结果的方式,而不是呈现或重定向。