bin/rackup in rack-0.3.0 vs bin/rackup in rack-0.4.0

- old
+ new

@@ -4,10 +4,12 @@ require 'optparse' automatic = false server = nil env = "development" +daemonize = false +pid = nil options = {:Port => 9292, :Host => "0.0.0.0", :AccessLog => []} opts = OptionParser.new("", 24, ' ') { |opts| opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]" @@ -53,10 +55,18 @@ opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e| env = e } + opts.on("-D", "--daemonize", "run daemonized in the background") { |d| + daemonize = d ? true : false + } + + opts.on("-P", "--pid FILE", "file to store PID (default: rack.pid)") { |f| + pid = File.expand_path(f) + } + opts.separator "" opts.separator "Common options:" opts.on_tail("-h", "--help", "Show this message") do puts opts @@ -91,12 +101,11 @@ require 'rack' require config inner_app = Object.const_get(File.basename(config, '.rb').capitalize) end -case server -when nil +unless server = Rack::Handler.get(server) # Guess. if ENV.include?("PHP_FCGI_CHILDREN") server = Rack::Handler::FastCGI # We already speak FastCGI @@ -109,30 +118,19 @@ server = Rack::Handler::Mongrel rescue LoadError => e server = Rack::Handler::WEBrick end end -when "mongrel" - server = Rack::Handler::Mongrel -when "webrick" - server = Rack::Handler::WEBrick -when "cgi" - server = Rack::Handler::CGI -when "fastcgi" - server = Rack::Handler::FastCGI -else - server = Rack::Handler.const_get(server.capitalize) end p server if $DEBUG case env when "development" app = Rack::Builder.new { use Rack::CommonLogger, STDERR unless server.name =~ /CGI/ use Rack::ShowExceptions - use Rack::Reloader use Rack::Lint run inner_app }.to_app when "deployment" @@ -147,8 +145,28 @@ end if $DEBUG pp app pp inner_app +end + +if daemonize + if RUBY_VERSION < "1.9" + exit if fork + Process.setsid + exit if fork + Dir.chdir "/" + File.umask 0000 + STDIN.reopen "/dev/null" + STDOUT.reopen "/dev/null", "a" + STDERR.reopen "/dev/null", "a" + else + Process.daemon + end + + if pid + File.open(pid, 'w'){ |f| f.write("#{Process.pid}") } + at_exit { File.delete(pid) if File.exist?(pid) } + end end server.run app, options