2011-04-13 35 views
1

我有一个ruby脚本,需要花费一定的时间才能完成运行。我试着运行这段代码:在Sinatra上启动一些进程然后重定向回来(即使进程仍在运行)

get "/run" do 
    exec "ruby #{"/home/user/script.rb"} &" 
    redirect '/' 
end 

但是会发生什么呢,那么我的Sinatra脚本会一直等到这个过程结束。如何执行该脚本以便在后台运行,并且我的Sinatra脚本只是重定向回来?

谢谢!

+0

可能重复:http://stackoverflow.com/questions/2504445/spawn-a-background-process-in-ruby – yan 2011-04-13 16:53:11

+0

我已经尝试过了,它有相同的效果 – spacemonkey 2011-04-13 16:56:46

回答

3

你必须分叉和分离子进程。

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 :)" 

这对我的作品。

+0

实际上这是行不通的对我来说,它在一个纯脚本中工作,尽管...浏览器等待页面响应,在终端中你可以看到脚本的输出 – spacemonkey 2011-04-14 09:03:04

4

我遇到了类似的问题,下面是为我工作的。

get "/run" do 

    task = Thread.new { 
     p "sleeping for 10 secs" 
     sleep(10) 
     p "woke up :)" 

    } 

    redirect '/' 
end 
相关问题