【问题标题】:Correct way to monitor ruby background processes (like Resque) in production在生产中监控 ruby​​ 后台进程(如 Resque)的正确方法
【发布时间】:2013-03-19 01:48:27
【问题描述】:

我已经为此苦苦挣扎了一段时间,启动 resque 和 resque 调度程序等后台进程的正确方法是什么?使用上帝是不是有点矫枉过正?

目前我正试图让上帝工作,但我不确定 *.god conf 文件是否应该在应用程序的目录中或其他地方。

这是我用的:

config
 |- app.god
 |- God
   |- resque.god
   |- resque_scheduler.god

# config/god/resque.god
rails_env   = ENV['RAILS_ENV']  || raise(ArgumentError, "RAILS_ENV not defined")
rails_root  = ENV['RAILS_ROOT'] || File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
num_workers = rails_env == 'production' ? 5 : 2

num_workers.times do |num|
  God.watch do |w|
    w.dir      = "#{rails_root}"
    w.name     = "resque-#{num}"
    w.group    = 'resque'
    w.interval = 30.seconds
    w.env      = {"QUEUE"=>"*", "RAILS_ENV"=>rails_env, "BUNDLE_GEMFILE"=>"#{rails_root}/Gemfile"}
    w.start    = "/usr/bin/rake -f #{rails_root}/Rakefile environment resque:work"
    w.log      = "#{rails_root}/log/resque-scheduler.log"

    ... start/stop methods  ...
  end
end

有一个 root 用户和一个 MyApp 用户。 MyApp 用户的应用位于:/home/myapp/apps/myapp_production/current

我使用的God capistrano食谱是:

# config/deploy.rb
after "deploy:restart", "god:restart"

namespace :god do
  def try_killing_resque_workers
    run "pkill -3 -f resque"
  rescue
    nil
  end

  desc "Restart God gracefully"
  task "restart", :roles => :app do
    god_config_path = File.join(release_path, 'config', 'app.god')
    begin
      # Throws an exception if god is not running.
      run "cd #{release_path}; bundle exec god status && RAILS_ENV=#{rails_env} RAILS_ROOT=#{release_path} bundle exec god load #{god_config_path} && bundle exec god start resque"

      # Kill resque processes and have god restart them with the newly loaded config.
      try_killing_resque_workers
    rescue => ex
      # god is dead, workers should be as well, but who knows.
      try_killing_resque_workers

      # Start god.
      run "cd #{release_path}; RAILS_ENV=#{rails_env} bundle exec god -c #{god_config_path}"
    end
  end
end

当我部署时,我得到 “服务器不可用(或者您没有访问权限)”

奇怪的是,当我什至以 root 身份登录并运行 god status 时,它什么也不返回,但如果我运行 god --version 它返回版本。

有人知道为什么吗?

【问题讨论】:

  • 我相信“god --version”只是让god二进制文件回显版本,而“god status”实际上试图与正在运行的God进程对话。上帝以用户身份运行(除非您另有说明,否则它产生的任何东西都将以该用户身份启动)。我不确定它是否只是我们的旧版本,但“上帝状态”似乎启动了一个上帝守护进程,无论你是什么用户,如果它还没有运行的话。在我们的例子中,我们想要的实际上帝守护进程以普通用户身份运行,任何使用 root 以“上帝状态”检查它的人最终都会以 root 身份启动守护进程(这是我们不想要的)。

标签: ruby-on-rails centos capistrano god


【解决方案1】:

您是否设置了 init.d 脚本? 你有上帝在运行吗?

/etc/init.d/god status

您可以尝试手动启动它

/usr/bin/god -c /etc/god/conf.god -D

并检查日志

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2020-10-19
    • 2011-01-31
    • 2017-08-15
    相关资源
    最近更新 更多