我有一个ruby脚本,需要花费一定的时间才能完成运行。我试着运行这段代码:在Sinatra上启动一些进程然后重定向回来(即使进程仍在运行)
get "/run" do
exec "ruby #{"/home/user/script.rb"} &"
redirect '/'
end
但是会发生什么呢,那么我的Sinatra脚本会一直等到这个过程结束。如何执行该脚本以便在后台运行,并且我的Sinatra脚本只是重定向回来?
谢谢!
我有一个ruby脚本,需要花费一定的时间才能完成运行。我试着运行这段代码:在Sinatra上启动一些进程然后重定向回来(即使进程仍在运行)
get "/run" do
exec "ruby #{"/home/user/script.rb"} &"
redirect '/'
end
但是会发生什么呢,那么我的Sinatra脚本会一直等到这个过程结束。如何执行该脚本以便在后台运行,并且我的Sinatra脚本只是重定向回来?
谢谢!
你必须分叉和分离子进程。
require 'rubygems'
require 'sinatra'
get "/" do
"index"
end
get "/run" do
Process.detach(fork{ exec "ruby script.rb &"})
redirect '/'
end
假设script.rb就像
p "sleeping for 10 secs"
sleep(10)
p "woke up :)"
这对我的作品。
实际上这是行不通的对我来说,它在一个纯脚本中工作,尽管...浏览器等待页面响应,在终端中你可以看到脚本的输出 – spacemonkey 2011-04-14 09:03:04
我遇到了类似的问题,下面是为我工作的。
get "/run" do
task = Thread.new {
p "sleeping for 10 secs"
sleep(10)
p "woke up :)"
}
redirect '/'
end
可能重复:http://stackoverflow.com/questions/2504445/spawn-a-background-process-in-ruby – yan 2011-04-13 16:53:11
我已经尝试过了,它有相同的效果 – spacemonkey 2011-04-13 16:56:46