2012-03-28 13 views
3

私はSinatra/Railsアプリケーションといくつかの長いプロセスを開始するアクションを持っています。Sinatraのバックグラウンドプロセスを実行

通常私はバックグラウンドジョブのキューを作成します。しかし、このケースはあまりにも単純で、バックグラウンドプロセスはごくまれにしか開始されないため、キューはオーバーヘッドです。

キューを使用せずにバックグラウンドプロセスを実行するにはどうすればよいですか?

get "/build_logs/:project" do 
    LogBuilder.new(params[:project]).generate 
    "done" 
end 

私は新しいスレッドまたはプロセスフォークとして作成しようとしましたが、それは役に立ちませんでした。

+0

私は一度永遠に推薦されました。レール特有のものではなく、かなり軽いものです。 –

答えて

1

私はシナトラでこれに成功(簡体字)を持っていた:

get '/start_process' 
    @@pid = Process.spawn('external_command_to_run') 
end 

これは、あなたが必要な場合は、後のプロセスを終了させるために使用できるプロセスIDを返します。また、これはLinux上であり、Windowsでは動作しません。

+0

Hm。今すぐテストしようとしています:) – fl00r

+0

http://railscasts.com/episodes/127-rake-in-background :)うまく動作します – fl00r

+1

おそらく、子プロセスが終了するのを待たずにサーバーが復帰することを期待しています。かなり典型的な使用例です。ゾンビプロセスがあなたのシステムに投入されないようにするには(数ヶ月間のゾンビプロセスがプロセスマップスペースを使い果たした後、私はかつてサーバがクラッシュした)、プロセスデータを@e pidに追加する必要があります。それを「生み出す」。 – sameers

関連する問題