用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本身中创建一个初始化程序,该初始化程序会寻找一个旧的母版并将其杀死,但这使我的内心无比思考。 一定有办法!     
已邀请:
我部分解决了这个问题:我看到的行为是由于未使用
preload_app true
引起的。如果您有此设置,则整个应用程序将由主服务器加载,并且工作人员会非常快速地生成。因此,如果第一个工作人员此时杀死了旧的主服务器,那是可以的,因为该工作人员可以立即开始处理请求! 如果您不能使用ѭ1,那么最好的选择可能是将旧的pid-quit行为转移到Rails初始化程序中,这样,一旦Rails启动并准备就绪,第一个提出您的应用程序的工作人员就可以杀死旧的master服务请求。     
似乎如果
preload_app
false
,向独角兽主机发送HUP信号是更好的选择。 从http://unicorn.bogomips.org/SIGNALS.html:   HUP-重新加载配置文件并   正常重启所有工作程序。如果   “ preload_app”指令为false(   默认),那么工作人员也会选择   当任何应用程序代码更改时   重新启动。     
这是我的before_fork块中的内容:
  old_pid = \"#{server.config[:pid]}.oldbin\"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
要重启我的独角兽,我有一个bash脚本,该脚本具有如下方法:
if sig USR2 && sig 0 && oldsig QUIT
then
    n=$TIMEOUT
    while test -s $old_pid && test $n -ge 0
    do
        printf \'.\' && sleep 1 && n=$(( $n - 1 ))
    done
    echo

    if test $n -lt 0 && test -s $old_pid
    then
        echo >&2 \"$old_pid still exists after $TIMEOUT seconds\"
        exit 1
    fi
    exit 0
fi
echo >&2 \"Couldn\'t upgrade, starting \'$CMD\' instead\"
$CMD
;;
bash脚本发送USR2信号,该信号派生新的独角兽并创建旧的pid。然后,它使用旧的pid发送旧的独角兽QUIT信号。 这个过程真的很好,取材于独角兽的死亡之地:看着独角兽工人的监督,这是极好的资源。     

要回复问题请先登录注册