Rufus-scheduler仅在生产时运行一次

时间:2011-09-14 17:02:11

标签: ruby-on-rails cron passenger rufus-scheduler

我正在使用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分钟后每小时运行一次。

真气的部分是它在我的本地机器上工作。该过程将定期运行并正常工作。只有在我部署到生产的应用程序上,该过程才会运行一次,而不是重复。

ps faux显示cron正在运行,乘客正在处理rails进程的启动,该站点已被再次ping通,因此它知道它应该刷新,并且生产显示代码中的更改。唯一不同的是,没有警告或错误,计划任务不会重复。

帮助!

3 个答案:

答案 0 :(得分:3)

您可能不应该在rails服务器本身中运行rufus-scheduler,尤其是不能使用像passenger这样的多进程框架。相反,您应该在守护进程中运行它。

我对正在发生的事情的理论:

Passenger启动一个ruby服务器进程并使用它来分叉其他服务器来处理请求。但由于rufus-scheduler在主线程的单独线程中运行其作业,因此rufus线程仅在原始ruby进程中处于活动状态(ruby的fork只复制执行分叉的线程)。这似乎是一件好事,因为它可以防止多个调度程序运行,但是...... Passenger可能会在某些条件下杀死ruby进程 - 如果它杀死原始进程,则调度程序线程就会消失。

答案 1 :(得分:3)

将以下行添加到apache2 config /etc/apache2/apache2.conf并重新启动apache服务器

 RailsAppSpawnerIdleTime 0
 PassengerMinInstances 1

答案 2 :(得分:2)

凯尔文是对的。

乘客杀死“不必要的”线程。

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