gpt4 book ai didi

ruby-on-rails - 用 USR2 重启 Unicorn - 退出 old master

转载 作者:数据小太阳 更新时间:2023-10-29 06:29:46 25 4
gpt4 key购买 nike

因此,将 USR2 发送给 Unicorn 非常棒——它会使用您的代码的新副本启动一个新的 master,并自动获取任何更改。甜的。我的问题是:我如何阻止老主人?显然被接受的方式是在 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

问题在于,一旦新主人(和新 worker )产生,它们就会杀死旧主人。因此,对站点的任何请求都只是等待新工作程序启动,通常会等待几秒钟,同时加载整个 Rails 堆栈。

如果我删除我的 before_fork,一切都会像我希望的那样工作(从客户的角度来看):我可以整天重新加载我的浏览器并且每个请求都很快得到满足,没有迹象表明新主人何时接管(除了看到我的代码更改现在出现)。但是,在我手动向它发送 QUIT 之前,老主人现在一直在闲逛。

据我所知,一旦工作人员完成加载并准备好为客户服务,就没有回调。这确实是我正在寻找的回调。我总是可以在 Rails 本身中创建一个初始化程序来寻找老主人并杀死它,但这让我一想到它就心痛。

一定有办法!

最佳答案

我部分解决了这个问题:我看到的行为是由于未使用 preload_app true 引起的。如果你有这个设置,那么整个应用程序都由 master 加载,worker 会很快生成。因此,如果此时第一个 worker 杀死了旧 master,那也没关系,因为该 worker 可以立即开始处理请求!

如果你不能使用 preload_app true 那么你最好的选择可能是将旧的 pid-quit 行为移动到 Rails 初始化程序中,这样第一个启动你的应用程序的工作人员就可以杀死一旦 Rails 启动并准备好处理请求,老主人。

关于ruby-on-rails - 用 USR2 重启 Unicorn - 退出 old master,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794176/

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