diff options
Diffstat (limited to 'lib/unicorn/launcher.rb')
-rw-r--r-- | lib/unicorn/launcher.rb | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/lib/unicorn/launcher.rb b/lib/unicorn/launcher.rb index 8c96059..e71f93b 100644 --- a/lib/unicorn/launcher.rb +++ b/lib/unicorn/launcher.rb @@ -1,4 +1,10 @@ -$stdin.sync = $stdout.sync = $stderr.sync = true +# -*- encoding: binary -*- + +$stdout.sync = $stderr.sync = true +$stdin.binmode +$stdout.binmode +$stderr.binmode + require 'unicorn' class Unicorn::Launcher @@ -13,21 +19,47 @@ class Unicorn::Launcher # the directory it was started in when being re-executed # to pickup code changes if the original deployment directory # is a symlink or otherwise got replaced. - def self.daemonize! + def self.daemonize!(options = nil) $stdin.reopen("/dev/null") # We only start a new process group if we're not being reexecuted # and inheriting file descriptors from our parent unless ENV['UNICORN_FD'] - exit if fork - Process.setsid - exit if fork + if options + # grandparent - reads pipe, exits when master is ready + # \_ parent - exits immediately ASAP + # \_ unicorn master - writes to pipe when ready + + rd, wr = IO.pipe + grandparent = $$ + if fork + wr.close # grandparent does not write + else + rd.close # unicorn master does not read + Process.setsid + exit if fork # parent dies now + end + if grandparent == $$ + # this will block until HttpServer#join runs (or it dies) + master_pid = (rd.readpartial(16) rescue nil).to_i + unless master_pid > 1 + warn "master failed to start, check stderr log for details" + exit!(1) + end + exit 0 + else # unicorn master process + options[:ready_pipe] = wr + end + else # backwards compat + exit if fork + Process.setsid + exit if fork + end # $stderr/$stderr can/will be redirected separately in the Unicorn config - $stdout.reopen("/dev/null", "a") - $stderr.reopen("/dev/null", "a") + Unicorn::Configurator::DEFAULTS[:stderr_path] = "/dev/null" + Unicorn::Configurator::DEFAULTS[:stdout_path] = "/dev/null" end - $stdin.sync = $stdout.sync = $stderr.sync = true end end |