gpt4 book ai didi

capistrano - 部署+重启后 unicorn 继续使用旧代码

转载 作者:行者123 更新时间:2023-12-04 06:42:06 28 4
gpt4 key购买 nike

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)在服务器上,发生的事情是创建了一个新的 unicorn master,而旧的有 (old)附加到它的名字。旧的永远不会被杀死,但即使我自己杀死它,新的 unicorn 实例仍然显示我部署之前的旧代码。新实例与旧实例具有相同的创建时间——就好像它只是被复制了一样。如果我停止实例,然后再次启动它,它就可以工作,但我希望能够进行零停机部署。

任何帮助表示赞赏。

编辑

在跟随 sugest Ilya O. 之后,我创建了一个执行此操作的 capistrano 任务:
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}"

这会在 pid 上运行 SIGUSR2,并终止旧的 unicorn 进程。问题是我所有的应用程序服务器都没有更新到我最近部署的代码,这个任务似乎只是将我的旧 unicorn 环境复制到一个新进程中。如果我只是简单地杀死主进程然后再次重新启动 unicorn ,它就可以正常工作,但是会有一分钟左右的请求丢失。

最佳答案

你有没有preload_app在您的 Unicorn 配置中设置为 true?如果是这样,您需要在新进程启动并运行后将 SIGUSR2 和 SIGQUIT 发送到原始主进程。

还可能发生的情况是原始主进程已经死亡,但子进程仍在为请求提供服务。您可以尝试发送 SIGUSR2,在新的主进程产生后,发送 SIGWINCH(到旧的主进程)以杀死旧的 unicorn 子进程,然后在旧的主进程上发送 SIGQUIT。您现在应该只有"new" unicorn 进程来处理请求。

编辑:尝试执行 SIGQUIT 而不是 SIGWINCH。我认为旧流程可能会在 SIGWINCH 之后产生 worker 。

关于capistrano - 部署+重启后 unicorn 继续使用旧代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13578687/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com