task :restart_unicorn, :except => { :no_release => true } do
run "#{try_sudo} kill -s USR2 $(cat /var/www/app_name/shared/pids/unicorn.pid)"
end
Когда я делаю sudo kill -s USR2 $(cat /var/www/app_name/shared/pids/unicorn.pid)
на сервере, происходит то, что создается новый мастер-единорог, а к имени старого добавляется (old)
. Старый никогда не уничтожается, но даже если я убью его самостоятельно, новый экземпляр единорога по-прежнему будет показывать старый код, существовавший до моего развертывания. Новый экземпляр имеет то же время создания, что и старый, как будто он просто дублируется. Если я остановлю экземпляр и запущу его снова, он сработает, но я хотел бы иметь возможность выполнять развертывание с нулевым временем простоя.
Любая помощь приветствуется.
ИЗМЕНИТЬ
Следуя совету Ильи О., я создал задачу капистрано, которая делает это:
old_pid = get_pid('/var/www/appname/shared/pids/unicorn.pid')
run "#{try_sudo} kill -s SIGUSR2 $(cat /var/www/appname/shared/pids/unicorn.pid)"
/var/www/app/current/tmp/pids/unicorn.pid)"
run "#{try_sudo} kill -s SIGWINCH #{old_pid}"
Это запускает SIGUSR2 на pid и убивает старый процесс единорога. Проблема в том, что весь мой сервер приложений никогда не обновляется до моего недавно развернутого кода, эта задача просто копирует мою старую среду единорога в новый процесс. Он отлично работает, если я просто убью главный процесс, а затем снова запущу unicorn заново, но затем будет минута или около того отброшенных запросов.