将God用于多个应用程序,并在重新启动后自动启动它们



我目前正在尝试使用god监控总共三个Rails/Rack应用程序的各种进程/守护进程。监控效果很好,问题是我无法将god配置为在重新启动后自动启动所有进程。

我的设置:我正在运行一个Linux VPS与Centos&Plesk。我有一个非root linux用户"deployer",用于部署&运行三个Rails/Rack应用程序。两个应用程序与乘客apache模块一起运行,第三个应用程序使用瘦服务器(这是必要的,因为该应用程序不能与apache一起工作)。使用passenger的两个Rails应用程序有额外的rake任务在后台运行——这些任务和瘦服务器都由god监控。

神宝石是在所有三个应用程序的宝石文件中指定的。

在每个deploy.rb文件中,我都有一个类似的方法

namespace :misc do
    desc "restart woekers using gog; restart webserver"
    task :restart, roles: [:web, :resque] do
        run "touch #{current_path}/tmp/restart.txt"
        god.all.start
        god.all.reload
        god.all.terminate
        god.all.start
    end
end

重新启动服务器后,如果我手动为所有三个应用程序运行cap-misc:restart,则所有进程都会正确启动和监控。

到目前为止,每次尝试在启动时自动启动god并启动所有必要的进程都失败了。我尝试了很多不同的方法,但都没用。到目前为止,我的方法是使用@reboot创建一个cron任务,该任务运行以下三个脚本:

#!/bin/bash -l
cd /path/to/app/ && bundle exec god -c /path/to/app/config/god/resque.god && bundle exec god load /path/to/app/config/god/resque.god && bundle exec god start resque

这对于第一个应用程序非常有效:上帝和所有进程都启动了。当为第二个应用程序执行脚本时(当然是使用正确的路径),上帝无法启动任务。我启用了登录god,错误消息(在机架应用程序的情况下)是"thin:command not found"。当我首先启动机架应用程序时,thin已正确启动,并且找不到其他任务的命令。

我不明白我的配置有什么问题。我在god调用前面添加了bundle-exec命令,正如您在上面看到的那样(因此命令应该在各自应用程序的环境中执行)——然而,它根本不起作用。

如果有人能帮助我让上帝自动启动,我将不胜感激。

如果您需要更多信息,请随时询问!

提前感谢!

Am正在做类似的事情,并采取了这种方法:

使用upstart或类似的东西在系统启动时启动god守护进程,对我来说,这是这样做的:

/etc/init/good.conf

description "god"
start on runlevel [2]
stop on runlevel [016]
console owner
exec /usr/local/rvm/bin/rvm_god -c /etc/god
respawn

那个家伙运行god指定一个带有-c选项的ruby god配置文件:

/etc/god

# Load the configs
God.load "/home/dangerousbeans/kitten_smusher/config/config.god"
God.load "/home/dangerousbeans/irc_nommer/config/config.god"

这个ruby dude加载到单独的应用程序god-configs中,运行god.load会启动它们。

我想,当我使用RVM时,各个文件看起来是这样的:/home/dangerousbeans/irc_commer/config/config.good

God.watch do |w|
  w.dir = "/home/dangerousbeans/irc_nommer"
  w.name = "IRCnommer"
  # scary rvm magic begins
  gemsets_path = [
        "/home/dangerousbeans/.rvm/gems/ruby-1.9.3-p125@irc_nommer/bin",
        "/home/dangerousbeans/.rvm/rubies/ruby-1.9.3-p125/bin",
    "/home/dangerousbeans/.rvm/bin",
      ENV['PATH'] # inherit this
    ].join(':')
   w.env      = {
    "PATH"        => gemsets_path,
        "GEM_PATH"    => "/home/dangerousbeans/.rvm/gems/ruby-1.9.3-p125@irc_nommer"
    }
  # scary rvm magic ends
  w.log = "/tmp/ircnommer.log"
  w.start = "ruby /home/dangerousbeans/irc_nommer/irc_nommer.rb"
  w.keepalive
end

关键是当上帝执行[start]命令时,手动和自动的环境是不同的。因此,您可以将命令env添加到该命令中。类似:

God.watch do |w|
  w.start    = "cd #{your_app_directory}; env >> log/god.log; your-real-command >> log/god.log 2>&1"
end

在同一目录中键入env时会有一些差异。检查差异并将所需/正确的段落添加到god的env中。

今天我遇到一个问题,我在一台服务器上部署了两个rails应用程序,两者都使用了上帝。应用程序#2无法正确启动命令。在完成上述测试后,我发现了原因:上帝持有一个指向应用程序#1的环境变量[BUNDLE_GEMFILE]。所以我添加了一条简单的行,然后错误消失了:

God.watch do |w|
  w.env = {
    "BUNDLE_GEMFILE" => "#{$rails_root}/Gemfile"
  }
end

相关内容

  • 没有找到相关文章

最新更新