Tôi nhận được lỗi R12 Exit Timeout cho một ứng dụng Heroku chạy unicorn và sidekiq. Những lỗi này xảy ra 1-2 lần một ngày và bất cứ khi nào tôi triển khai. Tôi hiểu rằng tôi cần chuyển đổi tín hiệu tắt máy từ Heroku để kỳ lân phản hồi chính xác, nhưng tôi nghĩ rằng tôi đã làm như vậy trong cấu hình kỳ lân bên dưới:
worker_processes 3
timeout 30
preload_app true
before_fork do |server, worker|
Signal.trap 'TERM' do
puts "Unicorn master intercepting TERM and sending myself QUIT instead. My PID is #{Process.pid}"
Process.kill 'QUIT', Process.pid
end
if defined?(ActiveRecord::Base)
ActiveRecord::Base.connection.disconnect!
Rails.logger.info('Disconnected from ActiveRecord')
end
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts "Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is #{Process.pid}"
end
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
Rails.logger.info('Connected to ActiveRecord')
end
Sidekiq.configure_client do |config|
config.redis = { :size => 1 }
end
end
Nhật ký của tôi xung quanh lỗi trông như thế này:
Stopping all processes with SIGTERM
Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is 7
Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is 11
Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT. My PID is 15
Unicorn master intercepting TERM and sending myself QUIT instead. My PID is 2
Started GET "/manage"
reaped #<Process::Status: pid 11 exit 0> worker=1
reaped #<Process::Status: pid 7 exit 0> worker=0
reaped #<Process::Status: pid 15 exit 0> worker=2
master complete
Error R12 (Exit timeout) -> At least one process failed to exit within 10 seconds of SIGTERM
Stopping remaining processes with SIGKILL
Process exited with status 137
Có vẻ như tất cả các quy trình con đã được gặt hái thành công trước thời gian chờ. Có thể là chủ nhân vẫn còn sống? Ngoài ra, bộ định tuyến có nên gửi yêu cầu web đến dyno trong khi tắt, như được hiển thị trong nhật ký không?
FWIW, tôi đang sử dụng plugin triển khai thời gian chết bằng không của Heroku ( https://devcenter.heroku.com/articles/labs-preboot/ ).