使用bluepill监视bundle exec unicorn_rails

时间:2011-06-03 00:38:26

标签: bundler unicorn bluepill

由于unicorn_rails抱怨不同的gem版本,我们在bluepill文件中移动了bundle exec unicorn_rails ...这个改变解决了特定的问题和事情的开始和停止,但是当我们尝试sudo bluepill状态时,我们现在得到

独角兽(pix:XXXXXX):不受监控

看起来像bluepill现在没有监控独角兽进程。如果我停止子进程,它将重新启动子进程,但不会重新启动父进程。

我已经四处寻找,但对这个问题找不到多少,并希望有人可以对此有所了解。 bluepill配置文件是

app_dir = "/opt/local/share/httpd/apps/xyz"
Bluepill.application('xyz', :log_file => "#{app_dir}/current/log/bluepill.log") do |app|
  app.process('unicorn') do |process|
    process.pid_file    = "#{app_dir}/shared/pids/unicorn.pid"
    process.working_dir = "#{app_dir}/current"

    process.stdout = process.stderr = "#{app_dir}/shared/log/unicorn.err.log"
    process.start_command = "bundle exec unicorn_rails -D -c #{app_dir}/current/config/environments/production/unicorn.rb -E production"
    process.stop_command = "kill -QUIT {{PID}}"
    process.restart_command = "kill -USR2 {{PID}}"

    process.start_grace_time = 8.seconds
    process.stop_grace_time = 5.seconds
    process.restart_grace_time = 13.seconds

    process.monitor_children do |child_process|
      child_process.stop_command = "kill -QUIT {{PID}}"

      child_process.checks :mem_usage, :every => 10.seconds, :below => 200.megabytes, :times => [3,5]
      child_process.checks :cpu_usage, :every => 10.seconds, :below => 50, :times => [3,5]
    end
  end

end

2 个答案:

答案 0 :(得分:3)

当您运行bundle exec时,它会设置一个环境并分叉unicorn_rails进程。 Bluepill最终监控原始bundle exec进程而不是独角兽,这就是您看不到监视的原因。

我直接在bluepill中设置我的bundler环境,然后直接执行unicorn_rails

Bluepill.application('xyz') do |app|
  app.environment = `env -i BUNDLE_GEMFILE=#{app_dir}/Gemfile bundle exec env`.lines.inject({}) do |env_hash,l|
    kv = l.chomp.split('=',2)
    env_hash[kv[0] = kv[1]
    env_hash
  end

  app.process('unicorn') do |process|
    process.start_command = "unicorn_rails -D -c #{app_dir}/current/config/environments/production/unicorn.rb -E production"
  end
end

(注意:为清楚起见,我省略了上述配置文件的一部分。您的配置文件看起来不错,只需尝试添加上面的app.environment内容并从启动命令中删除bundle exec。)

这通过使用反引号捕获bundler环境变量,将返回的字符串解析为哈希并将其分配给app.environment来设置bluepill中的环境。

答案 1 :(得分:3)

我知道这个问题已经过时了,但我已经面对这个问题好几周了。当我意识到'蓝色药丸退出',然后在独角兽运行时重新加载药丸时,我的怀疑被唤醒,允许蓝宝石将这个过程视为“向上”。

@ blt04的回答没有帮助。今天我意识到了。我的优雅开始时间为8秒是不够的,因为我在我的独角兽配置中有preload_app true ...我的应用程序(Rails)需要12秒才能加载,而不是8秒。

将开始时间提高到30秒(大大超过所需要的)解决了这个问题。 Bluepill只是说'开始'30秒,然后正确地进入'up'。 Unicorn正常启动并运行。

您希望重新启动时间长于Rails启动所需的时间。