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 分钟后每小时运行一次。

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

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

帮助!

4

3 回答 3

3

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

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

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

于 2011-09-14T17:25:33.143 回答
3

将以下行添加到您的 apache2 配置 /etc/apache2/apach2.conf 并重新启动您的 apache 服务器

 RailsAppSpawnerIdleTime 0
 PassengerMinInstances 1
于 2013-02-01T11:00:23.167 回答
2

开尔文是对的。

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

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

于 2011-09-14T22:04:18.937 回答