Vì vậy, việc gửi USR2 đến Unicorn thật tuyệt vời - nó khởi động một bản gốc mới với bản sao mã mới của bạn và tự động nhận bất kỳ thay đổi nào. Ngọt. Câu hỏi của tôi là: làm thế nào để ngăn chặn chủ cũ? Cách rõ ràng chấp nhận là trong một before_fork:Khởi động lại Unicorn bằng USR2 - bỏ chủ cũ
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
Vấn đề với điều này là ngay sau khi chủ mới (và công nhân mới) đều được sinh ra, họ giết thầy cũ. Vì vậy, bất kỳ yêu cầu đến trang web chỉ cần ngồi đó chờ đợi cho nhân viên mới bắt đầu, thường trong vài giây trong khi toàn bộ ngăn xếp Rails tải.
Nếu tôi xóa tất cả mọi thứ trước đây, tôi có thể tải lại trình duyệt của mình cả ngày và mọi yêu cầu được điền nhanh, không có chỉ báo khi nào chủ mới tiếp quản (khác thay vì nhìn thấy các thay đổi mã của tôi xuất hiện ngay bây giờ). Nhưng, ông chủ cũ đã treo xung quanh cho đến khi tôi gửi nó một cách QUIT.
Theo như tôi biết, không có gọi lại khi nhân viên hoàn tất tải và sẵn sàng phục vụ khách hàng. Đó thực sự là cuộc gọi lại mà tôi đang tìm kiếm. Tôi luôn luôn có thể tạo ra một initializer trong Rails chính nó tìm kiếm một bậc thầy cũ và giết chết nó, nhưng điều đó làm cho trái tim tôi đau chỉ nghĩ về nó.
Phải có cách!
Tôi chắc chắn rằng after_fork được gọi bởi công nhân khi họ tải xong, bạn có thể đặt mã ở đó .. –