2011-04-13 36 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 
相關問題