我对这里的部署策略感到有点困惑,在什么情况下我需要向独角兽发送reload
信号?例如,在我的情况下,它将是:
sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid`
我一直在通过杀死那个pid来部署我的应用程序,然后通过以下方式再次启动独角兽:
bundle exec unicorn -c config/unicorn/production.rb -E production -D
我只是想知道为什么我要使用重装?这样做可以为我的部署获得任何性能吗?
答案 0 :(得分:14)
当你杀死独角兽时,你会导致停机,直到独角兽可以重新开始。当你使用USR2信号时,独角兽首先启动新工人,然后一旦他们运行,就会杀死旧工人。它基本上都是为了消除“关闭”独角兽的需要。
注意,假设您在unicorn配置中有记录的before_fork
挂钩,以便处理旧工作者的查杀,如果找到“.oldbin”文件,则包含PID的老独角兽进程:
before_fork do |server, worker|
# a .oldbin file exists if unicorn was gracefully restarted with a USR2 signal
# we should terminate the old process now that we're up and running
old_pid = "#{pids_dir}/unicorn.pid.oldbin"
if File.exists?(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