5

由于 unicorn_rails 抱怨不同的 gem 版本,我们转而在我们的 bluepill 文件中运行 bundle exec unicorn_rails...。此更改解决了该特定问题并且事情开始和停止但是当我们尝试 sudo bluepill status 我们现在得到

独角兽(像素: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
4

2 回答 2

3

我知道这个问题很老,但我已经面临这个问题好几个星期了。当我意识到“bluepill 退出”时引起了我的怀疑,然后在独角兽运行时重新加载药丸允许 bluepill 考虑该过程“启动”。

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

将开始时间提高到 30 秒(大大超过了需要的时间)解决了这个问题。Bluepill 只会说“开始”30 秒,然后正确地“启动”。独角兽正常启动和运行。

你会希望你的重启时间比 Rails 启动的时间长。

于 2011-09-16T11:35:28.200 回答
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从您的启动命令中删除。)

这通过使用反引号捕获捆绑程序环境变量,将返回的字符串解析为哈希并将其分配给app.environment.

于 2011-08-18T15:42:34.960 回答