【问题标题】:Rufus-scheduler only running once on productionRufus-scheduler 仅在生产环境中运行一次
【发布时间】:2011-11-17 05:19:53
【问题描述】:

我每天都在使用 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,因此它知道应该刷新,并且生产显示代码中的更改。唯一不同的是,在没有警告或错误的情况下,计划任务不会重复。

救命!

【问题讨论】:

  • 我还确认两台机器上都安装了 rufus-scheduler gem,版本相同。
  • 请说明系统cron与此问题的关系

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

     RailsAppSpawnerIdleTime 0
     PassengerMinInstances 1
    

    【讨论】:

      【解决方案3】:

      开尔文是对的。

      Passenger 杀死“不必要的”线程。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 2012-12-26
        • 2011-03-20
        • 2016-10-22
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        相关资源
        最近更新 更多