2011-09-14 17 views
2

私はrufus-schedulerを使用して、レールサーバーから毎日プロセスを実行しています。テスト目的のために、5分ごとに言ってみましょう。私のコードは次のようになります。実行するためのプロセスを取得するには、例えば生産時に一度だけ実行するRufusスケジューラ

scheduler.cron '50 * * * *' do 
# stuff 
end 

ます。config /初期化子/ task_scheduler.rbで

scheduler = Rufus::Scheduler::PlainScheduler.start_new 
scheduler.every "10m", :first_in => '30s' do 
# Do stuff 
end 

私はまた、cronの形式を試してみました1時間ごとに50分ごとに毎時。

怒っている部分は、ローカルマシンで動作することです。このプロセスは定期的に実行され、機能します。プロダクションデプロイメントアプリケーションでは、プロセスは一度しか実行されず、繰り返し実行されることはありません。

ps fauxはcronが動作していることを示しています。乗客はレールプロセスのスピンアップを処理しています。サイトには再度pingが実行され、リフレッシュする必要があります。違うのは、警告またはエラーがなくても、スケジュールされたタスクは繰り返されないということだけです。

ヘルプ!

+0

を再起動し、私はルーファス・スケジューラの宝石がインストールされていることも確認されました両方のマシン、同じバージョン。 –

+0

システムのcronがこの問題にどのように関係しているか説明してください – Kelvin

答えて

2

rafus-schedulerは、railsサーバ自体で実行しないでください。特に、乗客のようなマルチプロセスフレームワークでは実行しないでください。代わりに、デーモンプロセスで実行する必要があります。

何が起こっているの私の理論は:

旅客はルビー・サーバー・プロセスを起動し、要求を処理するために他のサーバーをフォークし、それを使用しています。しかし、rufus-schedulerはメインスレッドとは別のスレッドでジョブを実行するので、rufusスレッドはオリジナルのrubyプロセスでのみ有効です(ルビーのフォークはフォークを行うスレッドを複製するだけです)。これは、複数のスケジューラが実行されるのを防ぐので、良いことのように思えるかもしれませんが...乗客は特定の条件下でルビプロセスを殺す可能性があります - 元のものを殺すと、スケジューラスレッドはなくなります。

3

あなたのapache2の設定/etc/apache2/apach2.confするには、以下の行を追加し、Apacheサーバー

RailsAppSpawnerIdleTime 0 
PassengerMinInstances 1 
関連する問題