我有一個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