def master_process
logger.info "New master process: #{Process.pid}"
STDOUT.flush
$0="#{self.config.name}[Master]"
self.start_parent
restart_needed = false
Signal.trap("USR1", proc {
logger.info "Master got a USR1."
restart_needed = true
})
Signal.trap("TERM", proc {
logger.info "Master got a TERM."
STDOUT.flush
kill_child_processes
Process.exit(0)
})
Signal.trap("INT", proc {
logger.info "Master got an INT."
STDOUT.flush
kill_child_processes
Process.exit(0)
})
Signal.trap('HUP', proc {})
loop do
sleep 2
if restart_needed
STDOUT.flush
self.kill_child_processes
load_config
self.start_parent
restart_needed = false
end
self.child_processes.each do |id, opts|
begin
Process.getpgid(opts[:pid])
rescue Errno::ESRCH
logger.info "Parent process #{config.name}[#{id}] has died (from PID #{opts[:pid]}), exiting master"
Process.exit(0)
end
end
end
end