我用乘客服务我的软件。它产生了许多ruby进程。
有时这些红宝石中的一颗会膨胀,我想让它死去。
我希望用上帝来达到这个目的。我的想法是监视所有这些红宝石,如果它在3个周期内消耗超过500MB的内存,上帝应该优雅地杀死它。如果它还活着超过5分钟,那么上帝不应该优雅地杀死它。
在我看来,上帝总是试图再次运行服务,所以它迫使我们提供一个启动命令。有没有可能只用上帝来杀死行为不好的进程,并让乘客产卵者在必要时把它们带回来生活?

最佳答案

你的问题的答案在于问题本身。您可以使用github的ruby进程监控框架god gem杀死ruby进程。
基本上,它是这样工作的:
将god配置为监视进程它可以是来自apache、passenger、mongrel的任何东西,也可以只是执行长时间运行任务的简单文件。
在god的配置文件中设置条件,god将根据这些条件执行一些预定义的代码。
下面是一个简单的例子(取自docs)。把它看作是一个文件长时间运行的进程,它运行不稳定,我们希望监视它的内存使用情况,我们称它为simple.rb

loop do
  puts 'Hello'
  sleep 1
end

现在,我们安装godgem并将其配置为以超级用户身份运行,以便它可以杀死/生成进程,然后创建配置文件。示例(也取自docs):
God.watch do |w|
  w.name = "simple"
  w.start = "ruby /full/path/to/simple.rb"
  w.keepalive(:memory_max => 500.megabytes)
end

在这里,您可能已经知道如果进程内存使用量超过500兆字节,上帝会重新启动它。如果您开始使用godgem进行流程管理,下面是一些可能有帮助的资源:
Example gist - Passenger worker monitor to kill workers which use too much RAM(不要使用上帝,而是产生一个新的客运工人)
Project Homepage
Github Page
An indepth tutorial using god with rails & passenger
现在,请记住god的所有配置实际上都是合法的ruby代码,这样您就可以获得创造性并做各种事情。
最后,如果您经常发现自己在运行长时间运行的进程,我建议您尝试JRuby这对于长时间运行的进程更有效,因为jvm比mri快得多

07-24 21:09