我目前正在尝试使用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