2

rufus-scheduler を使用して、Rails サーバーから毎日プロセスを実行しています。テストの目的で、5 分ごととしましょう。私のコードは次のようになります。

config/initializers/task_scheduler.rb 内

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

cron形式も試しました:

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

たとえば、毎時 50 分にプロセスを実行するようにします。

腹立たしいのは、それが私のローカルマシンで動作することです。プロセスは定期的に実行され、機能します。プロセスが 1 回実行され、繰り返されないのは、本番環境にデプロイされたアプリのみです。

ps faux は、cron が実行されていること、passenger が rails プロセスのスピンアップを処理していること、サイトが再度 ping されているため更新する必要があることを示していることを明らかにし、本番環境はコードの変更を示しています。唯一の違いは、警告やエラーがなければ、スケジュールされたタスクが繰り返されないことです。

ヘルプ!

4

3 に答える 3

3

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

何が起こっているかについての私の理論:

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

于 2011-09-14T17:25:33.143 に答える
2

ケルビンは正しいです。

Passenger は「不要な」スレッドを強制終了します。

http://groups.google.com/group/rufus-ruby/search?group=rufus-ruby&q=passenger

于 2011-09-14T22:04:18.937 に答える