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

phi*_*hil 8 ruby ruby-on-rails

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

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

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

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

有任何想法吗?

Mic*_*ile 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)
Run Code Online (Sandbox Code Playgroud)

它已经运行了好几个月,没有泄漏或没有问题。上帝有泄漏和死亡的问题。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" 
}
Run Code Online (Sandbox Code Playgroud)

-- 在启动命令之后是您想要传递给脚本的任何参数。