如何编写一个强大的永无止境的过程?

时间:2011-02-04 18:44:46

标签: ruby-on-rails ruby

我问了一个关于目录观看的另一个问题,这个问题得到了解答,但问题的另一半是如何最好地创建一个永无止境的过程,在ruby中,这样做。 以下是要求:

  • 永远跑步
  • 是可监视的(即知道它是上升还是下降)
  • 有某种方式重新启动它并确保它正常运行(上帝?)
  • 开始/停止使用Capistrano(会很好!)

我们看过BackgroundRb,但这看起来有点过时,说实话不可靠! 我们看过DelayedJob,但这似乎适合一次性工作(因为一项永无止境的工作似乎阻止任何其他工作完成,因为工作按顺序完成)。

我们正在运行一堆构成我们环境的Ubuntu服务器。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

我有一个事件机器循环拖尾一些nginx日志文件并将它们放入MongoDB。 “log eater”脚本与ruby守护进程一起运行。 http://daemons.rubyforge.org/

我发现它比上帝更可靠。如果脚本死亡,它还会监视并重新启动脚本。如果你想在跑步者死亡时收到通知,你可以使用monit来做到这一点。

这是守护进程的跑步者脚本:

#!/usr/bin/env ruby
require 'rubygems'
require 'bundler' 
Bundler.require(:default)
Bundler.setup(:default)

options = {
  :app_name   => "log_eater",
  :dir_mode   => :system,
  :multiple   => true,
  :backtrace  => true,
  :monitor    => true
}

Daemons.run(File.join(File.dirname(__FILE__), 'log_eater.rb'), options)

这已经运行了好几个月没有泄漏或没有问题。上帝有泄漏和死亡的问题。 Capistrano可以通过重新启动启动脚本来重新启动它。

以下是gentoo linux的摘录

start() {
ebegin "Starting log-eater"
    cd /ruby/STABLE/quickanalytics
   `scripts/log_eater_runner.rb start -- /usr/logs/nginx.log`
eend $? "Failed to start log-eater" 
}

- 启动命令用于您希望传递给脚本的任何args。

答案 1 :(得分:0)

我可能会看一下daemon-kit。不确定它是否符合您的所有要求:

https://github.com/kennethkalmer/daemon-kit

答案 2 :(得分:0)

请参阅Paul Dix的书 Service-Oriented Design with Ruby and Rails 。另请参阅Sinatra

答案 3 :(得分:0)

在你的情况下,我会使用Resque。它似乎满足您的要求。我相信它附带了capistrano用于控制工人的示例脚本。用上帝监视工作人员稍微复杂一点,但它确实带有一个Web控制台,以便您可以看到您的工作人员在做什么。它有很多插件可以满足您的任何需求。

https://github.com/defunkt/resque