【发布时间】:2011-08-13 05:51:45
【问题描述】:
因此,将 USR2 发送到 Unicorn 非常棒——它会使用您的代码的新副本启动一个新的 master,并自动获取任何更改。甜的。我的问题是:如何阻止老主人?显然接受的方式是在 before_fork 中:
before_fork do |server,worker|
old_pid = '/var/www/current/tmp/pids/unicorn.pid.oldbin'
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
这样做的问题是,一旦新主人(和新工人)产生,他们就会杀死旧主人。因此,对站点的任何请求都只是等待新的 worker 启动,通常会在整个 Rails 堆栈加载时等待几秒钟。
如果我删除我的 before_fork 一切都可以正常工作(从客户端的角度来看):我可以整天重新加载我的浏览器并且每个请求都很快得到满足,没有迹象表明新主人何时接管(除了看到我的代码更改现在出现)。但是,老主人现在挂了,直到我手动给它发送一个 QUIT。
据我所知,一旦工作人员完成加载并准备好为客户提供服务,就没有回调。这确实是我正在寻找的回调。我总是可以在 Rails 本身中创建一个初始化器,它会寻找一个旧的主人并杀死它,但这让我一想到它就心痛。
一定有办法!
【问题讨论】:
-
我很确定 after_fork 工作人员在完成加载后会调用它们,您可能可以将代码放在那里..
标签: ruby-on-rails ruby unicorn