Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- children = 40 # as desired
- min_children = 2 # as desired
- after_fork do |server, worker|
- # on re-deploys, want new workers to start up one at a time first, check if new master was re-deployed
- if ENV['UNICORN_FD']
- # second, check if still in a re-deploy
- old_pid = "#{server.config[:pid]}.oldbin"
- if File.exists?(old_pid) && server.pid != old_pid
- # kill an old worker|master only when a couple new workers are fully running
- if worker.nr >= min_children
- begin
- # kill an old worker if this is not the last new worker
- # kill the old master if this is the last worker
- Process.kill(worker.nr >= (children - 1) ? :QUIT : :TTOU, File.read(old_pid).to_i)
- rescue Errno::ENOENT, Errno::ESRCH
- # someone else did our job for us
- end
- end
- # start a new worker if this is not the last new worker
- if worker.nr < (children - 1)
- # first new worker must sleep to let new master finish new worker forking and install signal handlers
- if worker.nr == 0 then sleep 5 end
- # signal for a new worker
- new_pid = "#{server.config[:pid]}"
- Process.kill(:TTIN, File.read(new_pid).to_i)
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement