def self.start_at_port(port, opts = @opts)
at_exit do
Merb::Server.remove_pid(port)
end
Merb::Worker.start unless Merb.testing?
if Merb::Config[:daemonize]
Merb.trap('INT') do
Merb.exiting = true
stop
Merb.logger.warn! "Exiting port #{port}\n"
exit_process
end
elsif Merb::Config[:fork_for_class_load]
if Merb::Config[:console_trap]
Merb::Server.add_irb_trap
end
end
Merb.trap('HUP') do
Merb.exiting = true
stop
Merb.logger.warn! "Exiting port #{port} on #{Process.pid}\n"
exit_process
end
Merb.trap('ABRT') do
Merb.exiting = true
stopped = stop(128)
Merb.logger.warn! "Exiting port #{port}\n" if stopped
exit_process(128)
end
$0 = process_title(:worker, port)
Merb::Server.store_pid(port)
Merb::Config[:log_delimiter] = "#{process_title(:worker, port)} ~ "
Merb.reset_logger!
Merb.logger.warn!("Starting #{self.name.split("::").last} at port #{port}")
printed_warning = false
loop do
begin
new_server(port)
rescue Errno::EADDRINUSE => e
if Merb::Config[:bind_fail_fatal]
Merb.fatal! "Could not bind to #{port}. It was already in use", e
end
unless printed_warning
Merb.logger.warn! "Port #{port} is in use, " \
"Waiting for it to become available."
printed_warning = true
end
sleep 0.25
next
end
break
end
Merb.logger.warn! "Successfully bound to port #{port}"
Merb::Server.change_privilege
start_server
end