用USR2重新启动Unicorn-退出旧的Master
||
因此,将USR2发送给Unicorn真是棒极了-它会使用代码的新副本启动新的主服务器,并自动获取所有更改。甜。我的问题是:如何停止旧的大师?显然可以接受的方式是在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
问题在于,一旦产生了新的主人(和新工人),他们就会杀死旧主人。因此,对站点的任何请求都只坐在那里等待新工作人员启动,通常在整个Rails堆栈加载时等待几秒钟。
如果我删除了before_fork,一切都会按我希望的那样进行(从客户端的角度来看):我可以整天重新加载浏览器,并且每个请求都很快被填满,没有迹象表明新的主服务器何时接管(除了现在看到我的代码更改外)。但是,旧的主控器现在会徘徊,直到我手动将其发送给QUIT。
据我所知,一旦工作人员完成加载并准备为客户服务,就不会有回调。那真的是我正在寻找的回调。我总是可以在Rails本身中创建一个初始化程序,该初始化程序会寻找一个旧的母版并将其杀死,但这使我的内心无比思考。
一定有办法!
没有找到相关结果
已邀请:
3 个回复
磐乓铝举
引起的。如果您有此设置,则整个应用程序将由主服务器加载,并且工作人员会非常快速地生成。因此,如果第一个工作人员此时杀死了旧的主服务器,那是可以的,因为该工作人员可以立即开始处理请求! 如果您不能使用ѭ1,那么最好的选择可能是将旧的pid-quit行为转移到Rails初始化程序中,这样,一旦Rails启动并准备就绪,第一个提出您的应用程序的工作人员就可以杀死旧的master服务请求。
黎喊病
为
,向独角兽主机发送HUP信号是更好的选择。 从http://unicorn.bogomips.org/SIGNALS.html: HUP-重新加载配置文件并 正常重启所有工作程序。如果 “ preload_app”指令为false( 默认),那么工作人员也会选择 当任何应用程序代码更改时 重新启动。
死簇
要重启我的独角兽,我有一个bash脚本,该脚本具有如下方法:
bash脚本发送USR2信号,该信号派生新的独角兽并创建旧的pid。然后,它使用旧的pid发送旧的独角兽QUIT信号。 这个过程真的很好,取材于独角兽的死亡之地:看着独角兽工人的监督,这是极好的资源。